summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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