@@ -198,8 +198,8 @@ object Parsers {
198198 ! in.isSoftModifierInModifierPosition
199199
200200 def isExprIntro : Boolean =
201- canStartExpressionTokens.contains (in.token) &&
202- ! in.isSoftModifierInModifierPosition
201+ if (in.token == IMPLIED ) in.lookaheadIn( BitSet ( MATCH ))
202+ else (canStartExpressionTokens.contains(in.token) && ! in.isSoftModifierInModifierPosition)
203203
204204 def isDefIntro (allowedMods : BitSet ): Boolean =
205205 in.token == AT ||
@@ -1265,7 +1265,7 @@ object Parsers {
12651265 * | SimpleExpr1 ArgumentExprs `=' Expr
12661266 * | Expr2
12671267 * | [‘inline’] Expr2 `match' `{' CaseClauses `}'
1268- * | `implicit ' `match' `{' ImplicitCaseClauses `}'
1268+ * | `implied ' `match' `{' ImplicitCaseClauses `}'
12691269 * Bindings ::= `(' [Binding {`,' Binding}] `)'
12701270 * Binding ::= (id | `_') [`:' Type]
12711271 * Expr2 ::= PostfixExpr [Ascription]
@@ -1279,10 +1279,19 @@ object Parsers {
12791279
12801280 def expr (location : Location .Value ): Tree = {
12811281 val start = in.offset
1282- if (closureMods.contains(in.token)) {
1282+ if (in.token == IMPLIED ) {
1283+ val span = in.offset
1284+ in.nextToken()
1285+ if (in.token == MATCH )
1286+ impliedMatch(start, EmptyModifiers )
1287+ else {
1288+ syntaxError(em " illegal modifier for implied match " , span)
1289+ EmptyTree
1290+ }
1291+ }
1292+ else if (closureMods.contains(in.token)) {
12831293 val imods = modifiers(closureMods)
1284- if (in.token == MATCH ) implicitMatch(start, imods)
1285- else implicitClosure(start, location, imods)
1294+ implicitClosure(start, location, imods)
12861295 } else {
12871296 val saved = placeholderParams
12881297 placeholderParams = Nil
@@ -1457,13 +1466,13 @@ object Parsers {
14571466
14581467 /** `match' { ImplicitCaseClauses }
14591468 */
1460- def implicitMatch (start : Int , imods : Modifiers ) = {
1469+ def impliedMatch (start : Int , imods : Modifiers ) = {
14611470 def markFirstIllegal (mods : List [Mod ]) = mods match {
1462- case mod :: _ => syntaxError(em " illegal modifier for implicit match " , mod.span)
1471+ case mod :: _ => syntaxError(em " illegal modifier for implied match " , mod.span)
14631472 case _ =>
14641473 }
14651474 imods.mods match {
1466- case Mod .Implicit () :: mods => markFirstIllegal(mods)
1475+ case Mod .Implied () :: mods => markFirstIllegal(mods)
14671476 case mods => markFirstIllegal(mods)
14681477 }
14691478 val result @ Match (t, cases) =
@@ -1474,7 +1483,7 @@ object Parsers {
14741483 case pat => isVarPattern(pat)
14751484 }
14761485 if (! isImplicitPattern(pat))
1477- syntaxError(em " not a legal pattern for an implicit match " , pat.span)
1486+ syntaxError(em " not a legal pattern for an implied match " , pat.span)
14781487 }
14791488 result
14801489 }
@@ -1999,6 +2008,7 @@ object Parsers {
19992008 case ABSTRACT => Mod .Abstract ()
20002009 case FINAL => Mod .Final ()
20012010 case IMPLICIT => Mod .Implicit ()
2011+ case IMPLIED => Mod .Implied ()
20022012 case GIVEN => Mod .Given ()
20032013 case ERASED => Mod .Erased ()
20042014 case LAZY => Mod .Lazy ()
@@ -2668,7 +2678,7 @@ object Parsers {
26682678 case ENUM =>
26692679 enumDef(start, posMods(start, mods | Enum ))
26702680 case IMPLIED =>
2671- instanceDef(start, mods, atSpan(in.skipToken()) { Mod .Instance () })
2681+ instanceDef(start, mods, atSpan(in.skipToken()) { Mod .Implied () })
26722682 case _ =>
26732683 syntaxErrorOrIncomplete(ExpectedStartOfTopLevelDefinition ())
26742684 EmptyTree
@@ -3084,11 +3094,11 @@ object Parsers {
30843094 else if (isDefIntro(localModifierTokens))
30853095 if (closureMods.contains(in.token)) {
30863096 val start = in.offset
3087- var imods = modifiers(closureMods)
3097+ var imods = modifiers(closureMods + IMPLIED )
30883098 if (isBindingIntro)
30893099 stats += implicitClosure(start, Location .InBlock , imods)
30903100 else if (in.token == MATCH )
3091- stats += implicitMatch (start, imods)
3101+ stats += impliedMatch (start, imods)
30923102 else
30933103 stats +++= localDef(start, imods)
30943104 } else {
0 commit comments