@@ -920,6 +920,16 @@ object Parsers {
920920 val next = in.lookahead.token
921921 next == LBRACKET || next == LPAREN
922922
923+ private def withEndMigrationWarning (): Boolean =
924+ migrateTo3
925+ && {
926+ warning(
927+ em """ In Scala 3, `with` at the end of a line will start definitions,
928+ |so it cannot be used in front of a parent constructor anymore.
929+ |Place the `with` at the beginning of the next line instead. """ )
930+ true
931+ }
932+
923933 /** Does a template start after `with`? This is the case if either
924934 * - the next token is `{`
925935 * - the `with` is at the end of a line
@@ -931,17 +941,7 @@ object Parsers {
931941 val lookahead = in.LookaheadScanner ()
932942 lookahead.nextToken()
933943 lookahead.token == LBRACE
934- || lookahead.isAfterLineEnd
935- && {
936- if migrateTo3 then
937- warning(
938- em """ In Scala 3, `with` at the end of a line will start definitions,
939- |so it cannot be used in front of a parent constructor anymore.
940- |Place the `with` at the beginning of the next line instead. """ )
941- false
942- else
943- true
944- }
944+ || lookahead.isAfterLineEnd && ! withEndMigrationWarning()
945945 || (lookahead.isIdent || lookahead.token == THIS )
946946 && {
947947 lookahead.nextToken()
@@ -953,6 +953,20 @@ object Parsers {
953953 || lookahead.token == ARROW
954954 }
955955
956+ /** Does a refinement start after `with`? This is the case if either
957+ * - the next token is `{`
958+ * - the `with` is at the end of a line and is followed by a token that starts a declaration
959+ */
960+ def followingIsRefinementStart () =
961+ val lookahead = in.LookaheadScanner ()
962+ lookahead.nextToken()
963+ lookahead.token == LBRACE
964+ || lookahead.isAfterLineEnd
965+ && {
966+ if lookahead.token == INDENT then lookahead.nextToken()
967+ dclIntroTokens.contains(lookahead.token)
968+ }
969+
956970/* --------- OPERAND/OPERATOR STACK --------------------------------------- */
957971
958972 var opStack : List [OpInfo ] = Nil
@@ -1584,11 +1598,8 @@ object Parsers {
15841598 def withType (): Tree = withTypeRest(annotType())
15851599
15861600 def withTypeRest (t : Tree ): Tree =
1587- def isRefinementStart =
1588- val la = in.lookahead
1589- la.isAfterLineEnd || la.token == LBRACE
1590- if in.token == WITH && ! isRefinementStart then
1591- in.nextToken()
1601+ if in.token == WITH && ! followingIsRefinementStart() then
1602+ in.nextTokenNoIndent()
15921603 if sourceVersion.isAtLeast(`3.1`) then
15931604 deprecationWarning(DeprecatedWithOperator ())
15941605 atSpan(startOffset(t)) { makeAndType(t, withType()) }
@@ -3858,8 +3869,7 @@ object Parsers {
38583869 if (name != nme.ERROR )
38593870 self = makeSelfDef(name, tpt).withSpan(first.span)
38603871 }
3861- in.token = SELFARROW // suppresses INDENT insertion after `=>`
3862- in.nextToken()
3872+ in.nextTokenNoIndent()
38633873 }
38643874 else {
38653875 stats += first
0 commit comments