summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-05-31 19:50:08 +0000
committerPaul Phillips <paulp@improving.org>2011-05-31 19:50:08 +0000
commit46c81507437d3202826e2ab53f328b241a6c9387 (patch)
treec22cf225158c68206537ea2d12cb72cc9670d519
parented87ab5299ed3e19481ad14b1ab18d676c7c4a91 (diff)
downloadscala-46c81507437d3202826e2ab53f328b241a6c9387.tar.gz
scala-46c81507437d3202826e2ab53f328b241a6c9387.tar.bz2
scala-46c81507437d3202826e2ab53f328b241a6c9387.zip
Fixed a repl regression with parentheses handli...
Fixed a repl regression with parentheses handling, reminding me we really need that honest parser phase which doesn't betray us with parentheses abandonment and dramatic desugarings. I'll promote it from page 14 to page 11. Closes #4661, no review.
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/IMain.scala11
-rw-r--r--test/files/run/repl-parens.check27
-rw-r--r--test/files/run/repl-parens.scala14
3 files changed, 50 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/interpreter/IMain.scala b/src/compiler/scala/tools/nsc/interpreter/IMain.scala
index 803ef0225a..83a9669427 100644
--- a/src/compiler/scala/tools/nsc/interpreter/IMain.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/IMain.scala
@@ -440,8 +440,15 @@ class IMain(val settings: Settings, protected val out: PrintWriter) extends Impo
trees.last match {
case _:Assign => // we don't want to include assignments
case _:TermTree | _:Ident | _:Select => // ... but do want other unnamed terms.
- // The position of the last tree, and the source code split there.
- val lastpos = earliestPosition(trees.last)
+ // The position of the last tree
+ val lastpos0 = earliestPosition(trees.last)
+ // Oh boy, the parser throws away parens so "(2+2)" is mispositioned.
+ // So until we can fix the parser we'll have to go trawling.
+ val lastpos = {
+ val adjustment = (content take lastpos0).reverse takeWhile (ch => ch.isWhitespace || ch == '(') length;
+ lastpos0 - adjustment
+ }
+ // the source code split at the laboriously determined position.
val (l1, l2) = content splitAt lastpos
val prefix = if (l1.trim == "") "" else l1 + ";\n"
val varName = if (synthetic) freshInternalVarName() else freshUserVarName()
diff --git a/test/files/run/repl-parens.check b/test/files/run/repl-parens.check
new file mode 100644
index 0000000000..eeb21c67d0
--- /dev/null
+++ b/test/files/run/repl-parens.check
@@ -0,0 +1,27 @@
+Type in expressions to have them evaluated.
+Type :help for more information.
+
+scala> (2)
+res0: Int = 2
+
+scala> (2 + 2)
+res1: Int = 4
+
+scala> ((2 + 2))
+res2: Int = 4
+
+scala> (((2 + 2)), ((2 + 2)))
+res3: (Int, Int) = (4,4)
+
+scala> (((2 + 2)), ((2 + 2)), 2)
+res4: (Int, Int, Int) = (4,4,2)
+
+scala> ((((2 + 2)), ((2 + 2)), 2).productIterator ++ Iterator(3) mkString)
+res5: String = 4423
+
+scala>
+
+scala> 55 ; ((2 + 2)) ; (1, 2, 3)
+res6: (Int, Int, Int) = (1,2,3)
+
+scala>
diff --git a/test/files/run/repl-parens.scala b/test/files/run/repl-parens.scala
new file mode 100644
index 0000000000..cdfe53efe7
--- /dev/null
+++ b/test/files/run/repl-parens.scala
@@ -0,0 +1,14 @@
+import scala.tools.partest.ReplTest
+
+object Test extends ReplTest {
+ def code = """
+(2)
+(2 + 2)
+((2 + 2))
+(((2 + 2)), ((2 + 2)))
+(((2 + 2)), ((2 + 2)), 2)
+((((2 + 2)), ((2 + 2)), 2).productIterator ++ Iterator(3) mkString)
+
+55 ; ((2 + 2)) ; (1, 2, 3)
+ """.trim
+} \ No newline at end of file