Skip to content

Commit f16aa50

Browse files
committed
Revert "Better prediction after with in types"
This reverts commit 95437d1.
1 parent 0ef70b2 commit f16aa50

File tree

4 files changed

+21
-39
lines changed

4 files changed

+21
-39
lines changed

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -920,16 +920,6 @@ 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-
933923
/** Does a template start after `with`? This is the case if either
934924
* - the next token is `{`
935925
* - the `with` is at the end of a line
@@ -941,7 +931,17 @@ object Parsers {
941931
val lookahead = in.LookaheadScanner()
942932
lookahead.nextToken()
943933
lookahead.token == LBRACE
944-
|| lookahead.isAfterLineEnd && !withEndMigrationWarning()
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+
}
945945
|| (lookahead.isIdent || lookahead.token == THIS)
946946
&& {
947947
lookahead.nextToken()
@@ -953,20 +953,6 @@ 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-
970956
/* --------- OPERAND/OPERATOR STACK --------------------------------------- */
971957

972958
var opStack: List[OpInfo] = Nil
@@ -1598,8 +1584,11 @@ object Parsers {
15981584
def withType(): Tree = withTypeRest(annotType())
15991585

16001586
def withTypeRest(t: Tree): Tree =
1601-
if in.token == WITH && !followingIsRefinementStart() then
1602-
in.nextTokenNoIndent()
1587+
def isRefinementStart =
1588+
val la = in.lookahead
1589+
la.isAfterLineEnd || la.token == LBRACE
1590+
if in.token == WITH && !isRefinementStart then
1591+
in.nextToken()
16031592
if sourceVersion.isAtLeast(`3.1`) then
16041593
deprecationWarning(DeprecatedWithOperator())
16051594
atSpan(startOffset(t)) { makeAndType(t, withType()) }
@@ -3869,7 +3858,8 @@ object Parsers {
38693858
if (name != nme.ERROR)
38703859
self = makeSelfDef(name, tpt).withSpan(first.span)
38713860
}
3872-
in.nextTokenNoIndent()
3861+
in.token = SELFARROW // suppresses INDENT insertion after `=>`
3862+
in.nextToken()
38733863
}
38743864
else {
38753865
stats += first

compiler/src/dotty/tools/dotc/parsing/Scanners.scala

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,6 @@ object Scanners {
323323
printState()
324324
}
325325

326-
/** Like nextToken, but don't insert indent characters afterwards */
327-
def nextTokenNoIndent(): Unit =
328-
token = EMPTY // this will suppress newline and indent insertion
329-
nextToken()
330-
331326
final def printState() =
332327
if debugTokenStream && (showLookAheadOnDebug || !isInstanceOf[LookaheadScanner]) then
333328
print(s"[$show${if isInstanceOf[LookaheadScanner] then "(LA)" else ""}]")
@@ -498,6 +493,8 @@ object Scanners {
498493
if canStartIndentTokens.contains(lastToken) then
499494
currentRegion = Indented(nextWidth, Set(), lastToken, currentRegion)
500495
insert(INDENT, offset)
496+
else if lastToken == SELFARROW then
497+
currentRegion.knownWidth = nextWidth
501498
else if (lastWidth != nextWidth)
502499
errorButContinue(spaceTabMismatchMsg(lastWidth, nextWidth))
503500
currentRegion match {

compiler/src/dotty/tools/dotc/parsing/Tokens.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ object Tokens extends TokensCommon {
204204
final val QUOTE = 87; enter(QUOTE, "'")
205205

206206
final val COLONEOL = 88; enter(COLONEOL, ":", ": at eol")
207+
final val SELFARROW = 89; enter(SELFARROW, "=>") // reclassified ARROW following self-type
207208

208209
/** XML mode */
209210
final val XMLSTART = 99; enter(XMLSTART, "$XMLSTART$<") // TODO: deprecate

tests/neg/with-template.scala

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,4 @@ object Test2 extends A with
1111
println("foo")
1212
}
1313

14-
def foo: A with
15-
B with
16-
C = ???
17-
18-
19-
2014

0 commit comments

Comments
 (0)