summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2013-08-20 10:41:16 -0700
committerAdriaan Moors <adriaan.moors@typesafe.com>2013-08-20 10:41:16 -0700
commit738441cf58136bd4af9985886dd0cd38ccda0777 (patch)
treeda84b26f5ba64c2890b8a9333f6beab9a6f45740
parent38d5b203745e799d819759ccce2f96655085f537 (diff)
parent470c69928fe2bbf41c3142ac066c49fb7a0ee7c9 (diff)
downloadscala-738441cf58136bd4af9985886dd0cd38ccda0777.tar.gz
scala-738441cf58136bd4af9985886dd0cd38ccda0777.tar.bz2
scala-738441cf58136bd4af9985886dd0cd38ccda0777.zip
Merge pull request #2824 from qerub/ticket/7740
SI-7740 Trim stack trace before printing in REPL
-rw-r--r--src/compiler/scala/tools/nsc/util/package.scala9
-rw-r--r--src/repl/scala/tools/nsc/interpreter/IMain.scala16
-rw-r--r--src/repl/scala/tools/nsc/interpreter/Naming.scala2
-rw-r--r--test/files/run/repl-trim-stack-trace.scala33
4 files changed, 56 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/util/package.scala b/src/compiler/scala/tools/nsc/util/package.scala
index 752aac5c8c..ea3c9d8dde 100644
--- a/src/compiler/scala/tools/nsc/util/package.scala
+++ b/src/compiler/scala/tools/nsc/util/package.scala
@@ -8,6 +8,7 @@ package tools
package nsc
import java.io.{ OutputStream, PrintStream, ByteArrayOutputStream, PrintWriter, StringWriter }
+import scala.compat.Platform.EOL
package object util {
@@ -78,6 +79,14 @@ package object util {
s"$clazz$msg @ $frame"
}
+ def stackTracePrefixString(ex: Throwable)(p: StackTraceElement => Boolean): String = {
+ val frames = ex.getStackTrace takeWhile p map (" at " + _)
+ val msg = ex.getMessage match { case null => "" ; case s => s": $s" }
+ val clazz = ex.getClass.getName
+
+ s"$clazz$msg" +: frames mkString EOL
+ }
+
lazy val trace = new SimpleTracer(System.out)
@deprecated("Moved to scala.reflect.internal.util.StringOps", "2.10.0")
diff --git a/src/repl/scala/tools/nsc/interpreter/IMain.scala b/src/repl/scala/tools/nsc/interpreter/IMain.scala
index 1723344306..9596a360a9 100644
--- a/src/repl/scala/tools/nsc/interpreter/IMain.scala
+++ b/src/repl/scala/tools/nsc/interpreter/IMain.scala
@@ -7,6 +7,8 @@ package scala
package tools.nsc
package interpreter
+import PartialFunction.cond
+
import scala.language.implicitConversions
import scala.collection.mutable
@@ -20,7 +22,7 @@ import scala.reflect.internal.util.{ BatchSourceFile, SourceFile }
import scala.tools.util.PathResolver
import scala.tools.nsc.io.AbstractFile
import scala.tools.nsc.typechecker.{ TypeStrings, StructuredTypeStrings }
-import scala.tools.nsc.util.{ ScalaClassLoader, stringFromWriter }
+import scala.tools.nsc.util.{ ScalaClassLoader, stringFromWriter, stackTracePrefixString }
import scala.tools.nsc.util.Exceptional.unwrap
import javax.script.{AbstractScriptEngine, Bindings, ScriptContext, ScriptEngine, ScriptEngineFactory, ScriptException, CompiledScript, Compilable}
@@ -718,10 +720,18 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
throw t
val unwrapped = unwrap(t)
+
+ // Example input: $line3.$read$$iw$$iw$
+ val classNameRegex = (naming.lineRegex + ".*").r
+ def isWrapperInit(x: StackTraceElement) = cond(x.getClassName) {
+ case classNameRegex() if x.getMethodName == nme.CONSTRUCTOR.decoded => true
+ }
+ val stackTrace = util.stackTracePrefixString(unwrapped)(!isWrapperInit(_))
+
withLastExceptionLock[String]({
directBind[Throwable]("lastException", unwrapped)(StdReplTags.tagOfThrowable, classTag[Throwable])
- util.stackTraceString(unwrapped)
- }, util.stackTraceString(unwrapped))
+ stackTrace
+ }, stackTrace)
}
// TODO: split it out into a package object and a regular
diff --git a/src/repl/scala/tools/nsc/interpreter/Naming.scala b/src/repl/scala/tools/nsc/interpreter/Naming.scala
index 7f577b3a8b..cf38a2ae3a 100644
--- a/src/repl/scala/tools/nsc/interpreter/Naming.scala
+++ b/src/repl/scala/tools/nsc/interpreter/Naming.scala
@@ -40,7 +40,7 @@ trait Naming {
// $line3.$read$$iw$$iw$Bippy@4a6a00ca
private def noMeta(s: String) = "\\Q" + s + "\\E"
- private lazy val lineRegex = {
+ lazy val lineRegex = {
val sn = sessionNames
val members = List(sn.read, sn.eval, sn.print) map noMeta mkString ("(?:", "|", ")")
debugging("lineRegex")(noMeta(sn.line) + """\d+[./]""" + members + """[$.]""")
diff --git a/test/files/run/repl-trim-stack-trace.scala b/test/files/run/repl-trim-stack-trace.scala
new file mode 100644
index 0000000000..bbf46f2f19
--- /dev/null
+++ b/test/files/run/repl-trim-stack-trace.scala
@@ -0,0 +1,33 @@
+
+import scala.tools.partest.SessionTest
+
+// SI-7740
+object Test extends SessionTest {
+ def session =
+"""Type in expressions to have them evaluated.
+Type :help for more information.
+
+scala> def f = throw new Exception("Uh-oh")
+f: Nothing
+
+scala> f
+java.lang.Exception: Uh-oh
+ at .f(<console>:7)
+
+scala> def f = throw new Exception("")
+f: Nothing
+
+scala> f
+java.lang.Exception:
+ at .f(<console>:7)
+
+scala> def f = throw new Exception
+f: Nothing
+
+scala> f
+java.lang.Exception
+ at .f(<console>:7)
+
+scala> """
+
+}