@@ -199,8 +199,8 @@ object Parsers {
199199 ! in.isSoftModifierInModifierPosition
200200
201201 def isExprIntro : Boolean =
202- canStartExpressionTokens.contains (in.token) &&
203- ! in.isSoftModifierInModifierPosition
202+ if (in.token == IMPLIED ) in.lookaheadIn( BitSet ( MATCH ))
203+ else (canStartExpressionTokens.contains(in.token) && ! in.isSoftModifierInModifierPosition)
204204
205205 def isDefIntro (allowedMods : BitSet , excludedSoftModifiers : Set [TermName ] = Set .empty): Boolean =
206206 in.token == AT ||
@@ -1266,7 +1266,7 @@ object Parsers {
12661266 * | SimpleExpr1 ArgumentExprs `=' Expr
12671267 * | Expr2
12681268 * | [‘inline’] Expr2 `match' `{' CaseClauses `}'
1269- * | `implicit ' `match' `{' ImplicitCaseClauses `}'
1269+ * | `implied ' `match' `{' ImplicitCaseClauses `}'
12701270 * Bindings ::= `(' [Binding {`,' Binding}] `)'
12711271 * Binding ::= (id | `_') [`:' Type]
12721272 * Expr2 ::= PostfixExpr [Ascription]
@@ -1282,9 +1282,19 @@ object Parsers {
12821282 val start = in.offset
12831283 if (closureMods.contains(in.token)) {
12841284 val imods = modifiers(closureMods)
1285- if (in.token == MATCH ) implicitMatch (start, imods)
1285+ if (in.token == MATCH ) impliedMatch (start, imods)
12861286 else implicitClosure(start, location, imods)
1287- } else {
1287+ }
1288+ else if (in.token == IMPLIED ) {
1289+ in.nextToken()
1290+ if (in.token == MATCH )
1291+ impliedMatch(start, EmptyModifiers )
1292+ else {
1293+ syntaxError(" `match` expected" )
1294+ EmptyTree
1295+ }
1296+ }
1297+ else {
12881298 val saved = placeholderParams
12891299 placeholderParams = Nil
12901300
@@ -1458,13 +1468,13 @@ object Parsers {
14581468
14591469 /** `match' { ImplicitCaseClauses }
14601470 */
1461- def implicitMatch (start : Int , imods : Modifiers ) = {
1471+ def impliedMatch (start : Int , imods : Modifiers ) = {
14621472 def markFirstIllegal (mods : List [Mod ]) = mods match {
1463- case mod :: _ => syntaxError(em " illegal modifier for implicit match " , mod.span)
1473+ case mod :: _ => syntaxError(em " illegal modifier for implied match " , mod.span)
14641474 case _ =>
14651475 }
14661476 imods.mods match {
1467- case Mod .Implicit () :: mods => markFirstIllegal(mods)
1477+ case ( Mod .Implicit () | Mod . Implied () ) :: mods => markFirstIllegal(mods)
14681478 case mods => markFirstIllegal(mods)
14691479 }
14701480 val result @ Match (t, cases) =
@@ -1475,7 +1485,7 @@ object Parsers {
14751485 case pat => isVarPattern(pat)
14761486 }
14771487 if (! isImplicitPattern(pat))
1478- syntaxError(em " not a legal pattern for an implicit match " , pat.span)
1488+ syntaxError(em " not a legal pattern for an implied match " , pat.span)
14791489 }
14801490 result
14811491 }
@@ -2687,7 +2697,7 @@ object Parsers {
26872697 case ENUM =>
26882698 enumDef(start, posMods(start, mods | Enum ))
26892699 case IMPLIED =>
2690- instanceDef(start, mods, atSpan(in.skipToken()) { Mod .Instance () })
2700+ instanceDef(start, mods, atSpan(in.skipToken()) { Mod .Implied () })
26912701 case _ =>
26922702 syntaxErrorOrIncomplete(ExpectedStartOfTopLevelDefinition ())
26932703 EmptyTree
@@ -3107,7 +3117,7 @@ object Parsers {
31073117 if (isBindingIntro)
31083118 stats += implicitClosure(start, Location .InBlock , imods)
31093119 else if (in.token == MATCH )
3110- stats += implicitMatch (start, imods)
3120+ stats += impliedMatch (start, imods)
31113121 else
31123122 stats +++= localDef(start, imods)
31133123 } else {
0 commit comments