From ddf8a173b0a0bdb8f3f5f129701ec9eba429a5c1 Mon Sep 17 00:00:00 2001 From: Josh Suereth Date: Fri, 10 Oct 2014 13:47:02 -0400 Subject: [PATCH] Disable pattern matching in val syntax in sbt 0.13.7. Fixes #1661 or at least works around it for now. --- .../scala/sbt/internals/parser/SbtParser.scala | 15 +++++++++++++++ main/src/test/resources/error-format/4.sbt.txt | 1 + main/src/test/resources/old-format/21.sbt.txt | 5 +++++ .../parser/SplitExpressionsFilesTest.scala | 1 + sbt/src/sbt-test/project/defs/build.sbt | 4 ++++ 5 files changed, 26 insertions(+) create mode 100644 main/src/test/resources/error-format/4.sbt.txt create mode 100644 main/src/test/resources/old-format/21.sbt.txt diff --git a/main/src/main/scala/sbt/internals/parser/SbtParser.scala b/main/src/main/scala/sbt/internals/parser/SbtParser.scala index 785492e7b..cf62cf40a 100644 --- a/main/src/main/scala/sbt/internals/parser/SbtParser.scala +++ b/main/src/main/scala/sbt/internals/parser/SbtParser.scala @@ -92,6 +92,21 @@ private[sbt] case class SbtParser(file: File, lines: Seq[String]) extends Parsed Seq(t) } + // Check No val (a,b) = foo *or* val a,b = foo as these are problematic to range positions and the WHOLE architecture. + def isBadValDef(t: Tree): Boolean = + t match { + case (x @ (toolbox.u.ValDef(_, _, _, _) | toolbox.u.DefDef(_, _, _, _, _, _))) => + val content = modifiedContent.substring(x.pos.start, x.pos.end) + val prettyPrint = x.toString + (!(content contains "=") && (prettyPrint contains "=")) + case _ => false + } + parsedTrees.filter(isBadValDef).foreach { badTree => + // Issue errors + val positionLine = badTree.pos.line + throw new MessageOnlyException(s"""[$fileName]:$positionLine: Pattern matching in val statements is not supported""".stripMargin) + } + val (imports, statements) = parsedTrees partition { case _: Import => true case _ => false diff --git a/main/src/test/resources/error-format/4.sbt.txt b/main/src/test/resources/error-format/4.sbt.txt new file mode 100644 index 000000000..34381a270 --- /dev/null +++ b/main/src/test/resources/error-format/4.sbt.txt @@ -0,0 +1 @@ +val a,b = project \ No newline at end of file diff --git a/main/src/test/resources/old-format/21.sbt.txt b/main/src/test/resources/old-format/21.sbt.txt new file mode 100644 index 000000000..dc5e31bd3 --- /dev/null +++ b/main/src/test/resources/old-format/21.sbt.txt @@ -0,0 +1,5 @@ +val x = bar + +{ + val a,b = project +} \ No newline at end of file diff --git a/main/src/test/scala/sbt/internals/parser/SplitExpressionsFilesTest.scala b/main/src/test/scala/sbt/internals/parser/SplitExpressionsFilesTest.scala index 704e12366..003055719 100644 --- a/main/src/test/scala/sbt/internals/parser/SplitExpressionsFilesTest.scala +++ b/main/src/test/scala/sbt/internals/parser/SplitExpressionsFilesTest.scala @@ -134,6 +134,7 @@ abstract class AbstractSplitExpressionsFilesTest(pathName: String) extends Speci println(s"In file: $fileName, old splitter failed. ${ex.toString}") case SplitterComparison(_, util.Failure(ex)) => println(s"In file: $fileName, new splitter failed. ${ex.toString}") + ex.printStackTrace() case SplitterComparison(util.Success(resultOld), util.Success(resultNew)) => if (resultOld == resultNew) { println(s"In file: $fileName, same results (imports, settings): $resultOld") diff --git a/sbt/src/sbt-test/project/defs/build.sbt b/sbt/src/sbt-test/project/defs/build.sbt index d8e736d74..f5dca00bb 100644 --- a/sbt/src/sbt-test/project/defs/build.sbt +++ b/sbt/src/sbt-test/project/defs/build.sbt @@ -1,3 +1,5 @@ +lazy val a,b = project + def now = System.currentTimeMillis lazy val v = "1.0-" + @@ -10,3 +12,5 @@ val descr = "Description" name := n version := v + +