@@ -207,7 +207,7 @@ object Parsers {
207207 } && ! in.isSoftModifierInModifierPosition
208208
209209 def isExprIntro : Boolean =
210- canStartExpressionTokens .contains(in.token) && ! in.isSoftModifierInModifierPosition
210+ in.canStartExprTokens .contains(in.token) && ! in.isSoftModifierInModifierPosition
211211
212212 def isDefIntro (allowedMods : BitSet , excludedSoftModifiers : Set [TermName ] = Set .empty): Boolean =
213213 in.token == AT ||
@@ -1231,6 +1231,10 @@ object Parsers {
12311231 // note: next is defined here because current == NEWLINE
12321232 if (in.token == NEWLINE && in.next.token == token) in.nextToken()
12331233
1234+ def newLinesOptWhenFollowedBy (name : Name ): Unit =
1235+ if in.isNewLine && in.next.token == IDENTIFIER && in.next.name == name then
1236+ in.nextToken()
1237+
12341238 def newLineOptWhenFollowing (p : Int => Boolean ): Unit =
12351239 // note: next is defined here because current == NEWLINE
12361240 if (in.token == NEWLINE && p(in.next.token)) newLineOpt()
@@ -1246,7 +1250,7 @@ object Parsers {
12461250 }
12471251
12481252 def possibleTemplateStart (): Unit = {
1249- in.observeIndented(unless = noIndentTemplateTokens, unlessSoftKW = nme. derives )
1253+ in.observeIndented()
12501254 newLineOptWhenFollowedBy(LBRACE )
12511255 }
12521256
@@ -1651,7 +1655,7 @@ object Parsers {
16511655 def toBeContinued (altToken : Token ): Boolean =
16521656 if in.token == altToken || in.isNewLine || in.isScala2Mode then
16531657 false // a newline token means the expression is finished
1654- else if ! canStartStatTokens.contains(in.token)
1658+ else if ! in. canStartStatTokens.contains(in.token)
16551659 || in.isLeadingInfixOperator(inConditional = true )
16561660 then
16571661 true
@@ -1852,20 +1856,20 @@ object Parsers {
18521856 }
18531857 }
18541858 case _ =>
1855- if (isIdent(nme.inline) && ! in.inModifierPosition() && in.lookaheadIn(canStartExpressionTokens)) {
1859+ if isIdent(nme.inline)
1860+ && ! in.inModifierPosition()
1861+ && in.lookaheadIn(in.canStartExprTokens)
1862+ then
18561863 val start = in.skipToken()
1857- in.token match {
1864+ in.token match
18581865 case IF =>
18591866 ifExpr(start, InlineIf )
18601867 case _ =>
18611868 val t = postfixExpr()
18621869 if (in.token == MATCH ) matchExpr(t, start, InlineMatch )
1863- else {
1870+ else
18641871 syntaxErrorOrIncomplete(i " `match` or `if` expected but ${in.token} found " )
18651872 t
1866- }
1867- }
1868- }
18691873 else expr1Rest(postfixExpr(), location)
18701874 }
18711875
@@ -2012,7 +2016,7 @@ object Parsers {
20122016 def postfixExpr (): Tree = postfixExprRest(prefixExpr())
20132017
20142018 def postfixExprRest (t : Tree ): Tree =
2015- infixOps(t, canStartExpressionTokens , prefixExpr, maybePostfix = true )
2019+ infixOps(t, in.canStartExprTokens , prefixExpr, maybePostfix = true )
20162020
20172021 /** PrefixExpr ::= [`-' | `+' | `~' | `!'] SimpleExpr
20182022 */
@@ -2209,7 +2213,7 @@ object Parsers {
22092213 lookahead.nextToken()
22102214 lookahead.token != COLON
22112215 }
2212- else canStartExpressionTokens .contains(lookahead.token)
2216+ else in.canStartExprTokens .contains(lookahead.token)
22132217 }
22142218 }
22152219 if (in.token == LPAREN && (! inClassConstrAnnots || isLegalAnnotArg))
@@ -2338,7 +2342,7 @@ object Parsers {
23382342 dropParensOrBraces(start, if (in.token == YIELD || in.token == DO ) " " else " do" )
23392343 }
23402344 }
2341- in.observeIndented(unless = noIndentAfterEnumeratorTokens )
2345+ in.observeIndented()
23422346 res
23432347 }
23442348 else {
@@ -2484,7 +2488,7 @@ object Parsers {
24842488 /** InfixPattern ::= SimplePattern {id [nl] SimplePattern}
24852489 */
24862490 def infixPattern (): Tree =
2487- infixOps(simplePattern(), canStartExpressionTokens , simplePattern, isOperator = in.name != nme.raw.BAR )
2491+ infixOps(simplePattern(), in.canStartExprTokens , simplePattern, isOperator = in.name != nme.raw.BAR )
24882492
24892493 /** SimplePattern ::= PatVar
24902494 * | Literal
@@ -3470,6 +3474,7 @@ object Parsers {
34703474 /** Template ::= InheritClauses [TemplateBody]
34713475 */
34723476 def template (constr : DefDef , isEnum : Boolean = false ): Template = {
3477+ newLinesOptWhenFollowedBy(nme.derives )
34733478 val (parents, derived) = inheritClauses()
34743479 possibleTemplateStart()
34753480 if (isEnum) {
@@ -3482,10 +3487,11 @@ object Parsers {
34823487 /** TemplateOpt = [Template]
34833488 */
34843489 def templateOpt (constr : DefDef ): Template =
3485- possibleTemplateStart( )
3490+ newLinesOptWhenFollowedBy(nme. derives )
34863491 if in.token == EXTENDS || isIdent(nme.derives ) then
34873492 template(constr)
34883493 else
3494+ possibleTemplateStart()
34893495 if in.isNestedStart then
34903496 template(constr)
34913497 else
0 commit comments