diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-08-20 10:41:16 -0700 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-08-20 10:41:16 -0700 |
commit | 738441cf58136bd4af9985886dd0cd38ccda0777 (patch) | |
tree | da84b26f5ba64c2890b8a9333f6beab9a6f45740 | |
parent | 38d5b203745e799d819759ccce2f96655085f537 (diff) | |
parent | 470c69928fe2bbf41c3142ac066c49fb7a0ee7c9 (diff) | |
download | scala-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.scala | 9 | ||||
-rw-r--r-- | src/repl/scala/tools/nsc/interpreter/IMain.scala | 16 | ||||
-rw-r--r-- | src/repl/scala/tools/nsc/interpreter/Naming.scala | 2 | ||||
-rw-r--r-- | test/files/run/repl-trim-stack-trace.scala | 33 |
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> """ + +} |