@@ -193,9 +193,13 @@ object Parsers {
193193 /** Is current token a hard or soft modifier (in modifier position or not)? */
194194 def isModifier : Boolean = modifierTokens.contains(in.token) || in.isSoftModifier
195195
196- def isBindingIntro : Boolean =
197- canStartBindingTokens.contains(in.token) &&
198- ! in.isSoftModifierInModifierPosition
196+ def isBindingIntro : Boolean = {
197+ in.token match {
198+ case USCORE | LPAREN => true
199+ case IDENTIFIER | BACKQUOTED_IDENT => in.lookaheadIn(BitSet (COLON , ARROW ))
200+ case _ => false
201+ }
202+ } && ! in.isSoftModifierInModifierPosition
199203
200204 def isExprIntro : Boolean =
201205 canStartExpressionTokens.contains(in.token) &&
@@ -2267,12 +2271,12 @@ object Parsers {
22672271
22682272 type ImportConstr = (Boolean , Tree , List [Tree ]) => Tree
22692273
2270- /** Import ::= import [implied ] [ImportExpr {`,' ImportExpr}
2271- * Export ::= export [implied ] [ImportExpr {`,' ImportExpr}
2274+ /** Import ::= import [implicit ] [ImportExpr {`,' ImportExpr}
2275+ * Export ::= export [implicit ] [ImportExpr {`,' ImportExpr}
22722276 */
22732277 def importClause (leading : Token , mkTree : ImportConstr ): List [Tree ] = {
22742278 val offset = accept(leading)
2275- val importImplied = in.token == IMPLIED
2279+ val importImplied = in.token == IMPLICIT || in.token == IMPLIED
22762280 if (importImplied) in.nextToken()
22772281 commaSeparated(importExpr(importImplied, mkTree)) match {
22782282 case t :: rest =>
@@ -2582,10 +2586,16 @@ object Parsers {
25822586 case ENUM =>
25832587 enumDef(start, mods, atSpan(in.skipToken()) { Mod .Enum () })
25842588 case IMPLIED =>
2585- instanceDef(start, mods, atSpan(in.skipToken()) { Mod .Instance () })
2589+ instanceDef(start, addMod( mods, atSpan(in.skipToken()) { Mod .Instance () }) )
25862590 case _ =>
2587- syntaxErrorOrIncomplete(ExpectedStartOfTopLevelDefinition ())
2588- EmptyTree
2591+ mods.mods.lastOption match {
2592+ case Some (impl @ Mod .Implicit ()) =>
2593+ val strippedMods = mods.withFlags(mods.flags &~ Implicit ).withMods(mods.mods.init)
2594+ instanceDef(start, addMod(strippedMods, Mod .Instance ().withSpan(impl.span)))
2595+ case _ =>
2596+ syntaxErrorOrIncomplete(ExpectedStartOfTopLevelDefinition ())
2597+ EmptyTree
2598+ }
25892599 }
25902600 }
25912601
@@ -2683,8 +2693,8 @@ object Parsers {
26832693 * InstanceBody ::= [‘for’ ConstrApp {‘,’ ConstrApp }] {GivenParamClause} [TemplateBody]
26842694 * | ‘for’ Type {GivenParamClause} ‘=’ Expr
26852695 */
2686- def instanceDef (start : Offset , mods : Modifiers , instanceMod : Mod ) = atSpan(start, nameStart) {
2687- var mods1 = addMod( mods, instanceMod)
2696+ def instanceDef (start : Offset , mods : Modifiers ) = atSpan(start, nameStart) {
2697+ var mods1 = mods
26882698 val name = if (isIdent) ident() else EmptyTermName
26892699 val tparams = typeParamClauseOpt(ParamOwner .Def )
26902700 val parents =
@@ -2981,9 +2991,9 @@ object Parsers {
29812991 }
29822992 }
29832993
2984- /** BlockStatSeq ::= { BlockStat semi } [ResultExpr ]
2994+ /** BlockStatSeq ::= { BlockStat semi } [Expr ]
29852995 * BlockStat ::= Import
2986- * | Annotations [implicit] [lazy] Def
2996+ * | Annotations [implicit] [lazy] [erased] Def
29872997 * | Annotations LocalModifiers TmplDef
29882998 * | Expr1
29892999 * |
@@ -3005,13 +3015,12 @@ object Parsers {
30053015 var imods = modifiers(closureMods)
30063016 if (isBindingIntro)
30073017 stats += implicitClosure(start, Location .InBlock , imods)
3008- else if (in.token == MATCH )
3018+ else if (in.token == MATCH && imods.mods == Mod . Implicit () :: Nil )
30093019 stats += implicitMatch(start, imods)
30103020 else
30113021 stats +++= localDef(start, imods)
3012- } else {
3013- stats +++= localDef(in.offset)
30143022 }
3023+ else stats +++= localDef(in.offset)
30153024 else if (! isStatSep && (in.token != CASE )) {
30163025 exitOnError = mustStartStat
30173026 syntaxErrorOrIncomplete(IllegalStartOfStatement (isModifier))
0 commit comments