@@ -730,24 +730,23 @@ object Parsers {
730
730
}
731
731
}
732
732
733
- /** Type ::= [`implicit'] [`unused' ] FunArgTypes `=>' Type
733
+ /** Type ::= [FunArgMods ] FunArgTypes `=>' Type
734
734
* | HkTypeParamClause `->' Type
735
735
* | InfixType
736
+ * FunArgMods ::= `implicit' FunArgMods
737
+ * | `unused' FunArgMods
736
738
* FunArgTypes ::= InfixType
737
739
* | `(' [ FunArgType {`,' FunArgType } ] `)'
738
740
*/
739
741
def typ (): Tree = {
740
742
val start = in.offset
741
- val isImplicit = in.token == IMPLICIT
742
- if (isImplicit) in.nextToken()
743
- val isUnused = in.token == UNUSED
744
- if (isUnused) in.nextToken()
743
+ val imods = allFunctionMods(EmptyModifiers )
745
744
def functionRest (params : List [Tree ]): Tree =
746
745
atPos(start, accept(ARROW )) {
747
746
val t = typ()
748
- if (isImplicit && isUnused ) new UnusedImplicitFunction (params, t)
749
- else if (isImplicit ) new ImplicitFunction (params, t)
750
- else if (isUnused ) new UnusedFunction (params, t)
747
+ if (imods.is( Implicit ) && imods.is( Unused ) ) new UnusedImplicitFunction (params, t)
748
+ else if (imods.is( Implicit ) ) new ImplicitFunction (params, t)
749
+ else if (imods.is( Unused ) ) new UnusedFunction (params, t)
751
750
else Function (params, t)
752
751
}
753
752
val t =
@@ -762,7 +761,7 @@ object Parsers {
762
761
val ts = commaSeparated(funArgType)
763
762
openParens.change(LPAREN , - 1 )
764
763
accept(RPAREN )
765
- if (isImplicit || in.token == ARROW ) functionRest(ts)
764
+ if (imods.is( Implicit ) || in.token == ARROW ) functionRest(ts)
766
765
else {
767
766
for (t <- ts)
768
767
if (t.isInstanceOf [ByNameTypeTree ])
@@ -789,7 +788,7 @@ object Parsers {
789
788
case ARROW => functionRest(t :: Nil )
790
789
case FORSOME => syntaxError(ExistentialTypesNoLongerSupported ()); t
791
790
case _ =>
792
- if (isImplicit && ! t.isInstanceOf [ImplicitFunction ])
791
+ if (imods.is( Implicit ) && ! t.isInstanceOf [ImplicitFunction ])
793
792
syntaxError(" Types with implicit keyword can only be function types" , Position (start, start + nme.IMPLICITkw .asSimpleName.length))
794
793
t
795
794
}
@@ -1016,14 +1015,16 @@ object Parsers {
1016
1015
}
1017
1016
}
1018
1017
1019
- /** Expr ::= [`implicit' ] FunParams ` =>' Expr
1018
+ /** Expr ::= [FunArgMods ] FunParams =>' Expr
1020
1019
* | Expr1
1020
+ * FunArgMods ::= `implicit' FunArgMods
1021
+ * | `unused' FunArgMods
1021
1022
* FunParams ::= Bindings
1022
1023
* | id
1023
1024
* | `_'
1024
1025
* ExprInParens ::= PostfixExpr `:' Type
1025
1026
* | Expr
1026
- * BlockResult ::= [`implicit' ] FunParams ` =>' Block
1027
+ * BlockResult ::= [FunArgMods ] FunParams =>' Block
1027
1028
* | Expr1
1028
1029
* Expr1 ::= `if' `(' Expr `)' {nl} Expr [[semi] else Expr]
1029
1030
* | `if' Expr `then' Expr [[semi] else Expr]
@@ -1052,9 +1053,7 @@ object Parsers {
1052
1053
def expr (location : Location .Value ): Tree = {
1053
1054
val start = in.offset
1054
1055
if (in.token == IMPLICIT || in.token == UNUSED ) {
1055
- var imods = EmptyModifiers
1056
- if (in.token == IMPLICIT ) imods = implicitMods(imods)
1057
- if (in.token == UNUSED ) imods = unusedMods(imods)
1056
+ val imods = allFunctionMods(EmptyModifiers )
1058
1057
implicitClosure(start, location, imods)
1059
1058
} else {
1060
1059
val saved = placeholderParams
@@ -1751,11 +1750,14 @@ object Parsers {
1751
1750
normalize(loop(start))
1752
1751
}
1753
1752
1754
- def implicitMods (imods : Modifiers = EmptyModifiers ): Modifiers =
1755
- addMod(imods, atPos(accept(IMPLICIT )) { Mod .Implicit () })
1756
-
1757
- def unusedMods (imods : Modifiers = EmptyModifiers ): Modifiers =
1758
- addMod(imods, atPos(accept(UNUSED )) { Mod .Unused () })
1753
+ def allFunctionMods (imods : Modifiers , doIfImplicit : () => Unit = () => ()): Modifiers = {
1754
+ if (in.token == IMPLICIT ) {
1755
+ doIfImplicit()
1756
+ allFunctionMods(addMod(imods, atPos(accept(IMPLICIT )) { Mod .Implicit () }), doIfImplicit)
1757
+ } else if (in.token == UNUSED )
1758
+ allFunctionMods(addMod(imods, atPos(accept(UNUSED )) { Mod .Unused () }), doIfImplicit)
1759
+ else imods
1760
+ }
1759
1761
1760
1762
/** Wrap annotation or constructor in New(...).<init> */
1761
1763
def wrapNew (tpt : Tree ) = Select (New (tpt), nme.CONSTRUCTOR )
@@ -1843,11 +1845,11 @@ object Parsers {
1843
1845
def typeParamClauseOpt (ownerKind : ParamOwner .Value ): List [TypeDef ] =
1844
1846
if (in.token == LBRACKET ) typeParamClause(ownerKind) else Nil
1845
1847
1846
- /** ClsParamClauses ::= {ClsParamClause} [[nl] `(' `implicit' [`unused'] ClsParams `)']
1848
+ /** ClsParamClauses ::= {ClsParamClause} [[nl] `(' [`unused'] `implicit' [`unused'] ClsParams `)']
1847
1849
* ClsParamClause ::= [nl] `(' [`unused'] [ClsParams] ')'
1848
1850
* ClsParams ::= ClsParam {`' ClsParam}
1849
1851
* ClsParam ::= {Annotation} [{Modifier} (`val' | `var') | `inline'] Param
1850
- * DefParamClauses ::= {DefParamClause} [[nl] `(' `implicit' [`unused'] DefParams `)']
1852
+ * DefParamClauses ::= {DefParamClause} [[nl] `(' [`unused'] `implicit' DefParams `)']
1851
1853
* DefParamClause ::= [nl] `(' [`unused'] [DefParams] ')'
1852
1854
* DefParams ::= DefParam {`,' DefParam}
1853
1855
* DefParam ::= {Annotation} [`inline'] Param
@@ -1906,14 +1908,9 @@ object Parsers {
1906
1908
def paramClause (): List [ValDef ] = inParens {
1907
1909
if (in.token == RPAREN ) Nil
1908
1910
else {
1909
- if (in.token == IMPLICIT || in.token == UNUSED ) {
1910
- if (in.token == IMPLICIT ) {
1911
- implicitOffset = in.offset
1912
- imods = implicitMods(imods)
1913
- }
1914
- if (in.token == UNUSED )
1915
- imods = unusedMods(imods)
1916
- }
1911
+ if (in.token == IMPLICIT || in.token == UNUSED )
1912
+ imods = allFunctionMods(imods, () => implicitOffset = in.offset)
1913
+
1917
1914
commaSeparated(param)
1918
1915
}
1919
1916
}
@@ -2505,9 +2502,7 @@ object Parsers {
2505
2502
else if (isDefIntro(localModifierTokens))
2506
2503
if (in.token == IMPLICIT || in.token == UNUSED ) {
2507
2504
val start = in.offset
2508
- var imods = EmptyModifiers
2509
- if (in.token == IMPLICIT ) imods = implicitMods(imods)
2510
- if (in.token == UNUSED ) imods = unusedMods(imods)
2505
+ var imods = allFunctionMods(EmptyModifiers )
2511
2506
if (isBindingIntro) stats += implicitClosure(start, Location .InBlock , imods)
2512
2507
else stats +++= localDef(start, imods)
2513
2508
} else {
0 commit comments