From d8f42a996006e38c0ecc2d3f5a4ef7c916e2ef0a Mon Sep 17 00:00:00 2001
From: Albert Meltzer <7529386+kitbellew@users.noreply.github.com>
Date: Sun, 3 Mar 2024 06:50:27 -0800
Subject: [PATCH 1/2] Add another leading-infix test, with blank line
---
.../scala/meta/tests/parsers/DefnSuite.scala | 36 +++++++++++++++++++
.../dotty/SignificantIndentationSuite.scala | 20 +++++++++++
2 files changed, 56 insertions(+)
diff --git a/tests/shared/src/test/scala/scala/meta/tests/parsers/DefnSuite.scala b/tests/shared/src/test/scala/scala/meta/tests/parsers/DefnSuite.scala
index 3dec258916..6566ae4bcc 100644
--- a/tests/shared/src/test/scala/scala/meta/tests/parsers/DefnSuite.scala
+++ b/tests/shared/src/test/scala/scala/meta/tests/parsers/DefnSuite.scala
@@ -379,6 +379,26 @@ class DefnSuite extends ParseSuite {
runTestAssert[Stat](code, layout)(tree)
}
+ test("#3605 scala213") {
+ val code =
+ """|new A {
+ | def b: C =
+ | ???
+ |
+ |}
+ |""".stripMargin
+ val layout =
+ """|new A { def b: C = ??? }
+ |""".stripMargin
+ val tree = Term.NewAnonymous(
+ tpl(
+ List(Init(pname("A"), anon, Nil)),
+ List(Defn.Def(Nil, tname("b"), Nil, Some(pname("C")), tname("???")))
+ )
+ )
+ runTestAssert[Stat](code, layout)(tree)
+ }
+
test("#3571 scala213source3") {
implicit val Scala213 = scala.meta.dialects.Scala213Source3
val code =
@@ -399,4 +419,20 @@ class DefnSuite extends ParseSuite {
runTestAssert[Stat](code, layout)(tree)
}
+ test("#3605 scala213source3") {
+ implicit val Scala213 = scala.meta.dialects.Scala213Source3
+ val code =
+ """|new A {
+ | def b: C =
+ | ???
+ |
+ |}
+ |""".stripMargin
+ val error =
+ """|:2: error: illegal start of simple expression
+ | def b: C =
+ | ^""".stripMargin
+ runTestError[Stat](code, error)
+ }
+
}
diff --git a/tests/shared/src/test/scala/scala/meta/tests/parsers/dotty/SignificantIndentationSuite.scala b/tests/shared/src/test/scala/scala/meta/tests/parsers/dotty/SignificantIndentationSuite.scala
index 71bb178746..07b67c0bd2 100644
--- a/tests/shared/src/test/scala/scala/meta/tests/parsers/dotty/SignificantIndentationSuite.scala
+++ b/tests/shared/src/test/scala/scala/meta/tests/parsers/dotty/SignificantIndentationSuite.scala
@@ -3361,4 +3361,24 @@ class SignificantIndentationSuite extends BaseDottySuite {
runTestAssert[Stat](code, layout)(tree)
}
+ test("#3605 scala3") {
+ val code =
+ """|new A {
+ | def b: C =
+ | ???
+ |
+ |}
+ |""".stripMargin
+ val layout =
+ """|new A { def b: C = ??? }
+ |""".stripMargin
+ val tree = Term.NewAnonymous(
+ tpl(
+ List(Init(pname("A"), anon, Nil)),
+ List(Defn.Def(Nil, tname("b"), Nil, Some(pname("C")), tname("???")))
+ )
+ )
+ runTestAssert[Stat](code, layout)(tree)
+ }
+
}
From 33101468c4e5caa898781bd49368f3efcbab05e4 Mon Sep 17 00:00:00 2001
From: Albert Meltzer <7529386+kitbellew@users.noreply.github.com>
Date: Sun, 3 Mar 2024 06:52:26 -0800
Subject: [PATCH 2/2] ScannerTokens: yet another leading infix fix
- first, match HSpace instead of Whitespace, to exclude LFLF
- second, on double EOL, return No instead of InvalidArg (which is used
to indicate incorrectly indented infix arguments).
---
.../meta/internal/parsers/ScannerTokens.scala | 6 +++---
.../scala/meta/tests/parsers/DefnSuite.scala | 15 ++++++++++-----
2 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/scalameta/parsers/shared/src/main/scala/scala/meta/internal/parsers/ScannerTokens.scala b/scalameta/parsers/shared/src/main/scala/scala/meta/internal/parsers/ScannerTokens.scala
index c146049cb9..50c896b0c6 100644
--- a/scalameta/parsers/shared/src/main/scala/scala/meta/internal/parsers/ScannerTokens.scala
+++ b/scalameta/parsers/shared/src/main/scala/scala/meta/internal/parsers/ScannerTokens.scala
@@ -969,8 +969,8 @@ final class ScannerTokens(val tokens: Tokens)(implicit dialect: Dialect) {
private def isLeadingInfixArg(afterOpPos: Int, nextIndent: Int) = {
// we don't check for pos to be within bounds since we would exit on EOF first
@tailrec def iter(pos: Int, indent: Int, prevNoNL: Boolean): LeadingInfix = tokens(pos) match {
- case _: EOL => if (prevNoNL) iter(pos + 1, 0, false) else LeadingInfix.InvalidArg
- case _: Whitespace => iter(pos + 1, if (prevNoNL) indent else indent + 1, prevNoNL)
+ case _: EOL => if (prevNoNL) iter(pos + 1, 0, false) else LeadingInfix.No
+ case _: HSpace => iter(pos + 1, if (prevNoNL) indent else indent + 1, prevNoNL)
case c: Comment =>
val commentIndent = multilineCommentIndent(c)
iter(pos + 1, if (commentIndent < 0) indent else commentIndent, true)
@@ -981,7 +981,7 @@ final class ScannerTokens(val tokens: Tokens)(implicit dialect: Dialect) {
}
tokens(afterOpPos) match {
case _: EOL => iter(afterOpPos + 1, 0, false)
- case _: Whitespace => iter(afterOpPos + 1, -1, true)
+ case _: HSpace => iter(afterOpPos + 1, -1, true)
case _: Comment => LeadingInfix.InvalidArg
case _ => LeadingInfix.No
}
diff --git a/tests/shared/src/test/scala/scala/meta/tests/parsers/DefnSuite.scala b/tests/shared/src/test/scala/scala/meta/tests/parsers/DefnSuite.scala
index 6566ae4bcc..8b2b1c4127 100644
--- a/tests/shared/src/test/scala/scala/meta/tests/parsers/DefnSuite.scala
+++ b/tests/shared/src/test/scala/scala/meta/tests/parsers/DefnSuite.scala
@@ -428,11 +428,16 @@ class DefnSuite extends ParseSuite {
|
|}
|""".stripMargin
- val error =
- """|:2: error: illegal start of simple expression
- | def b: C =
- | ^""".stripMargin
- runTestError[Stat](code, error)
+ val layout =
+ """|new A { def b: C = ??? }
+ |""".stripMargin
+ val tree = Term.NewAnonymous(
+ tpl(
+ List(Init(pname("A"), anon, Nil)),
+ List(Defn.Def(Nil, tname("b"), Nil, Some(pname("C")), tname("???")))
+ )
+ )
+ runTestAssert[Stat](code, layout)(tree)
}
}