@@ -1343,7 +1343,7 @@ object Parsers {
1343
1343
private def flagOfToken (tok : Int ): FlagSet = tok match {
1344
1344
case ABSTRACT => Abstract
1345
1345
case FINAL => Final
1346
- case IMPLICIT => Implicit
1346
+ case IMPLICIT => ImplicitCommon
1347
1347
case LAZY => Lazy
1348
1348
case OVERRIDE => Override
1349
1349
case PRIVATE => Private
@@ -1377,12 +1377,21 @@ object Parsers {
1377
1377
|| flags1.isTypeFlags && flags2.isTypeFlags
1378
1378
)
1379
1379
1380
- def addFlag (mods : Modifiers , flag : FlagSet ): Modifiers =
1380
+ def addFlag (mods : Modifiers , flag : FlagSet ): Modifiers = {
1381
+ def incompatible (kind : String ) = {
1382
+ syntaxError(s " modifier(s) ` ${mods.flags}' not allowed for $kind" )
1383
+ Modifiers (flag)
1384
+ }
1381
1385
if (compatible(mods.flags, flag)) mods | flag
1382
- else {
1383
- syntaxError(s " illegal modifier combination: ${mods.flags} and $flag" )
1384
- mods
1386
+ else flag match {
1387
+ case Trait => incompatible(" trait" )
1388
+ case Method => incompatible(" method" )
1389
+ case Mutable => incompatible(" variable" )
1390
+ case _ =>
1391
+ syntaxError(s " illegal modifier combination: ${mods.flags} and $flag" )
1392
+ mods
1385
1393
}
1394
+ }
1386
1395
1387
1396
/** AccessQualifier ::= "[" (Id | this) "]"
1388
1397
*/
@@ -1726,6 +1735,7 @@ object Parsers {
1726
1735
}
1727
1736
makeConstructor(Nil , vparamss, rhs).withMods(mods)
1728
1737
} else {
1738
+ val mods1 = addFlag(mods, Method )
1729
1739
val name = ident()
1730
1740
val tparams = typeParamClauseOpt(ParamOwner .Def )
1731
1741
val vparamss = paramClauses(name)
@@ -1735,7 +1745,7 @@ object Parsers {
1735
1745
if (atScala2Brace) tpt = scalaUnit else accept(EQUALS )
1736
1746
expr()
1737
1747
} else EmptyTree
1738
- DefDef (name, tparams, vparamss, tpt, rhs).withMods(mods | Method )
1748
+ DefDef (name, tparams, vparamss, tpt, rhs).withMods(mods1 )
1739
1749
}
1740
1750
}
1741
1751
@@ -1792,7 +1802,7 @@ object Parsers {
1792
1802
*/
1793
1803
def tmplDef (start : Int , mods : Modifiers ): Tree = in.token match {
1794
1804
case TRAIT =>
1795
- classDef(posMods(start, mods | Trait ))
1805
+ classDef(posMods(start, addFlag( mods, Trait ) ))
1796
1806
case CLASS =>
1797
1807
classDef(posMods(start, mods))
1798
1808
case CASECLASS =>
@@ -2009,7 +2019,7 @@ object Parsers {
2009
2019
}
2010
2020
2011
2021
def localDef (start : Int , implicitFlag : FlagSet ): Tree =
2012
- defOrDcl(start, defAnnotsMods(localModifierTokens) | implicitFlag)
2022
+ defOrDcl(start, addFlag( defAnnotsMods(localModifierTokens), implicitFlag) )
2013
2023
2014
2024
/** BlockStatSeq ::= { BlockStat semi } [ResultExpr]
2015
2025
* BlockStat ::= Import
@@ -2038,7 +2048,7 @@ object Parsers {
2038
2048
if (in.token == IMPLICIT ) {
2039
2049
val start = in.skipToken()
2040
2050
if (isIdent) stats += implicitClosure(start, Location .InBlock )
2041
- else stats += localDef(start, Implicit )
2051
+ else stats += localDef(start, ImplicitCommon )
2042
2052
} else {
2043
2053
stats += localDef(in.offset, EmptyFlags )
2044
2054
}
0 commit comments