@@ -920,6 +920,16 @@ object Parsers {
920
920
val next = in.lookahead.token
921
921
next == LBRACKET || next == LPAREN
922
922
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
+
923
933
/** Does a template start after `with`? This is the case if either
924
934
* - the next token is `{`
925
935
* - the `with` is at the end of a line
@@ -931,17 +941,7 @@ object Parsers {
931
941
val lookahead = in.LookaheadScanner ()
932
942
lookahead.nextToken()
933
943
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()
945
945
|| (lookahead.isIdent || lookahead.token == THIS )
946
946
&& {
947
947
lookahead.nextToken()
@@ -953,6 +953,20 @@ object Parsers {
953
953
|| lookahead.token == ARROW
954
954
}
955
955
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
+
956
970
/* --------- OPERAND/OPERATOR STACK --------------------------------------- */
957
971
958
972
var opStack : List [OpInfo ] = Nil
@@ -1584,11 +1598,8 @@ object Parsers {
1584
1598
def withType (): Tree = withTypeRest(annotType())
1585
1599
1586
1600
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()
1592
1603
if sourceVersion.isAtLeast(`3.1`) then
1593
1604
deprecationWarning(DeprecatedWithOperator ())
1594
1605
atSpan(startOffset(t)) { makeAndType(t, withType()) }
@@ -3858,8 +3869,7 @@ object Parsers {
3858
3869
if (name != nme.ERROR )
3859
3870
self = makeSelfDef(name, tpt).withSpan(first.span)
3860
3871
}
3861
- in.token = SELFARROW // suppresses INDENT insertion after `=>`
3862
- in.nextToken()
3872
+ in.nextTokenNoIndent()
3863
3873
}
3864
3874
else {
3865
3875
stats += first
0 commit comments