@@ -1465,22 +1465,10 @@ object Parsers {
1465
1465
1466
1466
/* -------- MODIFIERS and ANNOTATIONS ------------------------------------------- */
1467
1467
1468
- private def flagOfToken (tok : Int ): FlagSet = tok match {
1469
- case ABSTRACT => Abstract
1470
- case FINAL => Final
1471
- case IMPLICIT => ImplicitCommon
1472
- case INLINE => Inline
1473
- case LAZY => Lazy
1474
- case OVERRIDE => Override
1475
- case PRIVATE => Private
1476
- case PROTECTED => Protected
1477
- case SEALED => Sealed
1478
- }
1479
-
1480
1468
private def modOfToken (tok : Int ): Mod = tok match {
1481
1469
case ABSTRACT => Mod .Abstract ()
1482
1470
case FINAL => Mod .Final ()
1483
- case IMPLICIT => Mod .Implicit ()
1471
+ case IMPLICIT => Mod .Implicit (ImplicitCommon )
1484
1472
case INLINE => Mod .Inline ()
1485
1473
case LAZY => Mod .Lazy ()
1486
1474
case OVERRIDE => Mod .Override ()
@@ -1502,12 +1490,10 @@ object Parsers {
1502
1490
1503
1491
private def addModifier (mods : Modifiers ): Modifiers = {
1504
1492
val tok = in.token
1505
- val flag = flagOfToken(tok)
1506
- val mod = atPos(in.offset) { in.nextToken(); modOfToken(tok) }
1493
+ val mod = atPos(in.skipToken()) { modOfToken(tok) }
1507
1494
1508
- if (mods is flag) syntaxError(" repeated modifier" )
1509
- val res = addFlag(mods, flag).withAddedMod(mod)
1510
- res
1495
+ if (mods is mod.flags) syntaxError(" repeated modifier" )
1496
+ addMod(mods, mod)
1511
1497
}
1512
1498
1513
1499
private def compatible (flags1 : FlagSet , flags2 : FlagSet ): Boolean = (
@@ -1533,6 +1519,11 @@ object Parsers {
1533
1519
}
1534
1520
}
1535
1521
1522
+ /** Always add the syntactic `mod`, but check and conditionally add semantic `mod.flags`
1523
+ */
1524
+ def addMod (mods : Modifiers , mod : Mod ): Modifiers =
1525
+ addFlag(mods, mod.flags).withAddedMod(mod)
1526
+
1536
1527
/** AccessQualifier ::= "[" (Id | this) "]"
1537
1528
*/
1538
1529
def accessQualifierOpt (mods : Modifiers ): Modifiers =
@@ -1629,7 +1620,7 @@ object Parsers {
1629
1620
mods =
1630
1621
atPos(start, in.offset) {
1631
1622
if (in.token == TYPE ) {
1632
- val mod = atPos(in.offset) { in.nextToken(); Mod .Type () }
1623
+ val mod = atPos(in.skipToken()) { Mod .Type () }
1633
1624
(mods | Param | ParamAccessor ).withAddedMod(mod)
1634
1625
} else {
1635
1626
if (mods.hasFlags) syntaxError(" `type' expected" )
@@ -1674,7 +1665,6 @@ object Parsers {
1674
1665
* Param ::= id `:' ParamType [`=' Expr]
1675
1666
*/
1676
1667
def paramClauses (owner : Name , ofCaseClass : Boolean = false ): List [List [ValDef ]] = {
1677
- var implicitFlag = EmptyFlags
1678
1668
var implicitMod : Mod = null
1679
1669
var firstClauseOfCaseClass = ofCaseClass
1680
1670
var implicitOffset = - 1 // use once
@@ -1686,11 +1676,11 @@ object Parsers {
1686
1676
mods =
1687
1677
atPos(start, in.offset) {
1688
1678
if (in.token == VAL ) {
1689
- val mod = atPos(in.offset) { in.nextToken(); Mod .Val () }
1679
+ val mod = atPos(in.skipToken()) { Mod .Val () }
1690
1680
mods.withAddedMod(mod)
1691
1681
} else if (in.token == VAR ) {
1692
- val mod = atPos(in.offset) { in.nextToken(); Mod .Var () }
1693
- addFlag (mods, Mutable ).withAddedMod( mod)
1682
+ val mod = atPos(in.skipToken()) { Mod .Var () }
1683
+ addMod (mods, mod)
1694
1684
} else {
1695
1685
if (! (mods.flags &~ (ParamAccessor | Inline )).isEmpty)
1696
1686
syntaxError(" `val' or `var' expected" )
@@ -1712,7 +1702,7 @@ object Parsers {
1712
1702
if (in.token == ARROW ) {
1713
1703
if (owner.isTypeName && ! (mods is Local ))
1714
1704
syntaxError(s " ${if (mods is Mutable ) " `var'" else " `val'" } parameters may not be call-by-name " )
1715
- else if (! implicitFlag.isEmpty )
1705
+ else if (implicitMod != null )
1716
1706
syntaxError(" implicit parameters may not be call-by-name" )
1717
1707
}
1718
1708
paramType()
@@ -1724,17 +1714,16 @@ object Parsers {
1724
1714
mods = mods.withPos(mods.pos.union(Position (implicitOffset, implicitOffset)))
1725
1715
implicitOffset = - 1
1726
1716
}
1727
- if (implicitMod != null ) mods = mods.withAddedMod( implicitMod)
1728
- ValDef (name, tpt, default).withMods(addFlag( mods, implicitFlag) )
1717
+ if (implicitMod != null ) mods = addMod(mods, implicitMod)
1718
+ ValDef (name, tpt, default).withMods(mods)
1729
1719
}
1730
1720
}
1731
1721
def paramClause (): List [ValDef ] = inParens {
1732
1722
if (in.token == RPAREN ) Nil
1733
1723
else {
1734
1724
if (in.token == IMPLICIT ) {
1735
1725
implicitOffset = in.offset
1736
- implicitMod = atPos(in.offset) { in.nextToken(); Mod .Implicit () }
1737
- implicitFlag = Implicit
1726
+ implicitMod = atPos(in.skipToken()) { Mod .Implicit (Implicit ) }
1738
1727
}
1739
1728
commaSeparated(param)
1740
1729
}
@@ -1744,7 +1733,7 @@ object Parsers {
1744
1733
if (in.token == LPAREN )
1745
1734
paramClause() :: {
1746
1735
firstClauseOfCaseClass = false
1747
- if (implicitFlag.isEmpty ) clauses() else Nil
1736
+ if (implicitMod == null ) clauses() else Nil
1748
1737
}
1749
1738
else Nil
1750
1739
}
@@ -1837,12 +1826,12 @@ object Parsers {
1837
1826
*/
1838
1827
def defOrDcl (start : Int , mods : Modifiers ): Tree = in.token match {
1839
1828
case VAL =>
1840
- val mod = atPos(in.offset) { in.nextToken(); Mod .Val () }
1829
+ val mod = atPos(in.skipToken()) { Mod .Val () }
1841
1830
val modPos = atPos(start) { mods.withAddedMod(mod) }
1842
1831
patDefOrDcl(start, modPos, in.getDocComment(start))
1843
1832
case VAR =>
1844
- val mod = atPos(in.offset) { in.nextToken(); Mod .Var () }
1845
- val modPos = atPos(start) { addFlag (mods, Mutable ).withAddedMod( mod) }
1833
+ val mod = atPos(in.skipToken()) { Mod .Var () }
1834
+ val modPos = atPos(start) { addMod (mods, mod) }
1846
1835
patDefOrDcl(start, modPos, in.getDocComment(start))
1847
1836
case DEF =>
1848
1837
defDefOrDcl(start, posMods(start, mods), in.getDocComment(start))
@@ -2231,7 +2220,7 @@ object Parsers {
2231
2220
else if (isDefIntro(localModifierTokens))
2232
2221
if (in.token == IMPLICIT ) {
2233
2222
val start = in.offset
2234
- val mod = atPos(in.offset) { in.nextToken(); Mod .Implicit () }
2223
+ val mod = atPos(in.skipToken()) { Mod .Implicit (ImplicitCommon ) }
2235
2224
if (isIdent) stats += implicitClosure(start, Location .InBlock , Some (mod))
2236
2225
else stats += localDef(start, ImplicitCommon , Some (mod))
2237
2226
} else {
0 commit comments