Skip to content

Commit 30e0bcf

Browse files
committed
Merge pull request scala#3239 from soc/SI-8052
SI-8052 Disallow `macro` as an identifier
2 parents 64e2143 + ea8ae48 commit 30e0bcf

File tree

3 files changed

+44
-24
lines changed

3 files changed

+44
-24
lines changed

src/compiler/scala/tools/nsc/ast/parser/Parsers.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,7 @@ self =>
671671
def isRawBar = isIdent && in.name == raw.BAR
672672

673673
def isIdent = in.token == IDENTIFIER || in.token == BACKQUOTED_IDENT
674+
def isMacro = in.token == IDENTIFIER && in.name == nme.MACROkw
674675

675676
def isLiteralToken(token: Token) = token match {
676677
case CHARLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT |
@@ -1038,6 +1039,8 @@ self =>
10381039
def identForType(): TypeName = ident().toTypeName
10391040
def identForType(skipIt: Boolean): TypeName = ident(skipIt).toTypeName
10401041

1042+
def identOrMacro(): Name = if (isMacro) rawIdent() else ident()
1043+
10411044
def selector(t: Tree): Tree = {
10421045
val point = in.offset
10431046
//assert(t.pos.isDefined, t)
@@ -2551,7 +2554,7 @@ self =>
25512554
}
25522555
else {
25532556
val nameOffset = in.offset
2554-
val name = ident()
2557+
val name = identOrMacro()
25552558
funDefRest(start, nameOffset, mods, name)
25562559
}
25572560
}
@@ -2584,7 +2587,7 @@ self =>
25842587
} else {
25852588
if (in.token == EQUALS) {
25862589
in.nextTokenAllow(nme.MACROkw)
2587-
if (in.token == IDENTIFIER && in.name == nme.MACROkw) {
2590+
if (isMacro) {
25882591
in.nextToken()
25892592
newmods |= Flags.MACRO
25902593
}

src/compiler/scala/tools/nsc/ast/parser/Scanners.scala

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,12 @@ trait Scanners extends ScannersCommon {
204204
val idx = name.start - kwOffset
205205
if (idx >= 0 && idx < kwArray.length) {
206206
token = kwArray(idx)
207-
if (token == IDENTIFIER && allowIdent != name && emitIdentifierDeprecationWarnings)
208-
deprecationWarning(name+" is now a reserved word; usage as an identifier is deprecated")
207+
if (token == IDENTIFIER && allowIdent != name) {
208+
if (name == nme.MACROkw)
209+
syntaxError(name+" is now a reserved word; usage as an identifier is disallowed")
210+
else if (emitIdentifierDeprecationWarnings)
211+
deprecationWarning(name+" is now a reserved word; usage as an identifier is deprecated")
212+
}
209213
}
210214
}
211215
}
Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,67 @@
1-
macro-deprecate-idents.scala:2: warning: macro is now a reserved word; usage as an identifier is deprecated
1+
macro-deprecate-idents.scala:2: error: macro is now a reserved word; usage as an identifier is disallowed
22
val macro = ???
33
^
4-
macro-deprecate-idents.scala:6: warning: macro is now a reserved word; usage as an identifier is deprecated
4+
macro-deprecate-idents.scala:6: error: macro is now a reserved word; usage as an identifier is disallowed
55
var macro = ???
66
^
7-
macro-deprecate-idents.scala:10: warning: macro is now a reserved word; usage as an identifier is deprecated
7+
macro-deprecate-idents.scala:10: error: macro is now a reserved word; usage as an identifier is disallowed
88
type macro = Int
99
^
10-
macro-deprecate-idents.scala:14: warning: macro is now a reserved word; usage as an identifier is deprecated
10+
macro-deprecate-idents.scala:14: error: macro is now a reserved word; usage as an identifier is disallowed
1111
class macro
1212
^
13-
macro-deprecate-idents.scala:18: warning: macro is now a reserved word; usage as an identifier is deprecated
13+
macro-deprecate-idents.scala:18: error: macro is now a reserved word; usage as an identifier is disallowed
1414
class macro
1515
^
16-
macro-deprecate-idents.scala:22: warning: macro is now a reserved word; usage as an identifier is deprecated
16+
macro-deprecate-idents.scala:22: error: macro is now a reserved word; usage as an identifier is disallowed
1717
object macro
1818
^
19-
macro-deprecate-idents.scala:26: warning: macro is now a reserved word; usage as an identifier is deprecated
19+
macro-deprecate-idents.scala:26: error: macro is now a reserved word; usage as an identifier is disallowed
2020
object macro
2121
^
22-
macro-deprecate-idents.scala:30: warning: macro is now a reserved word; usage as an identifier is deprecated
22+
macro-deprecate-idents.scala:30: error: macro is now a reserved word; usage as an identifier is disallowed
2323
trait macro
2424
^
25-
macro-deprecate-idents.scala:34: warning: macro is now a reserved word; usage as an identifier is deprecated
25+
macro-deprecate-idents.scala:34: error: macro is now a reserved word; usage as an identifier is disallowed
2626
trait macro
2727
^
28-
macro-deprecate-idents.scala:37: warning: macro is now a reserved word; usage as an identifier is deprecated
28+
macro-deprecate-idents.scala:37: error: macro is now a reserved word; usage as an identifier is disallowed
2929
package macro {
3030
^
31-
macro-deprecate-idents.scala:38: warning: macro is now a reserved word; usage as an identifier is deprecated
31+
macro-deprecate-idents.scala:38: error: macro is now a reserved word; usage as an identifier is disallowed
3232
package macro.bar {
3333
^
34-
macro-deprecate-idents.scala:43: warning: macro is now a reserved word; usage as an identifier is deprecated
34+
macro-deprecate-idents.scala:43: error: macro is now a reserved word; usage as an identifier is disallowed
3535
package macro.foo {
3636
^
37-
macro-deprecate-idents.scala:48: warning: macro is now a reserved word; usage as an identifier is deprecated
37+
macro-deprecate-idents.scala:48: error: macro is now a reserved word; usage as an identifier is disallowed
3838
val Some(macro) = Some(42)
3939
^
40-
macro-deprecate-idents.scala:49: warning: macro is now a reserved word; usage as an identifier is deprecated
40+
macro-deprecate-idents.scala:49: error: macro is now a reserved word; usage as an identifier is disallowed
4141
macro match {
4242
^
43-
macro-deprecate-idents.scala:50: warning: macro is now a reserved word; usage as an identifier is deprecated
43+
macro-deprecate-idents.scala:50: error: macro is now a reserved word; usage as an identifier is disallowed
4444
case macro => println(macro)
4545
^
46-
macro-deprecate-idents.scala:50: warning: macro is now a reserved word; usage as an identifier is deprecated
46+
macro-deprecate-idents.scala:50: error: macro is now a reserved word; usage as an identifier is disallowed
4747
case macro => println(macro)
4848
^
49-
macro-deprecate-idents.scala:55: warning: macro is now a reserved word; usage as an identifier is deprecated
49+
macro-deprecate-idents.scala:55: error: macro is now a reserved word; usage as an identifier is disallowed
5050
def macro = 2
5151
^
52-
error: No warnings can be incurred under -Xfatal-warnings.
53-
17 warnings found
54-
one error found
52+
macro-deprecate-idents.scala:3: error: '=' expected but '}' found.
53+
}
54+
^
55+
macro-deprecate-idents.scala:7: error: '=' expected but '}' found.
56+
}
57+
^
58+
macro-deprecate-idents.scala:42: error: '{' expected but ';' found.
59+
package foo {
60+
^
61+
macro-deprecate-idents.scala:45: error: '{' expected but '}' found.
62+
}
63+
^
64+
macro-deprecate-idents.scala:52: error: ')' expected but '}' found.
65+
}
66+
^
67+
22 errors found

0 commit comments

Comments
 (0)