diff options
author | Paul Phillips <paulp@improving.org> | 2011-05-31 19:50:08 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-05-31 19:50:08 +0000 |
commit | 46c81507437d3202826e2ab53f328b241a6c9387 (patch) | |
tree | c22cf225158c68206537ea2d12cb72cc9670d519 | |
parent | ed87ab5299ed3e19481ad14b1ab18d676c7c4a91 (diff) | |
download | scala-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.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 |