diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/interpreter/IMain.scala | 11 | ||||
-rw-r--r-- | test/files/run/repl-parens.check | 27 | ||||
-rw-r--r-- | test/files/run/repl-parens.scala | 14 |
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 |