diff options
6 files changed, 15 insertions, 14 deletions
diff --git a/core/src/main/scala/mill/eval/Evaluator.scala b/core/src/main/scala/mill/eval/Evaluator.scala index e9b34204..5aa3439c 100644 --- a/core/src/main/scala/mill/eval/Evaluator.scala +++ b/core/src/main/scala/mill/eval/Evaluator.scala @@ -214,9 +214,9 @@ class Evaluator[T](val workspacePath: Path, target.evaluate(args) } } - }catch{ - case NonFatal(e) => - Result.Exception(e) + }catch{ case NonFatal(e) => + val currentStack = new Exception().getStackTrace + Result.Exception(e, currentStack) }finally{ System.setErr(err) System.setOut(out) diff --git a/core/src/main/scala/mill/eval/Result.scala b/core/src/main/scala/mill/eval/Result.scala index e0cc18bb..a9b2c70b 100644 --- a/core/src/main/scala/mill/eval/Result.scala +++ b/core/src/main/scala/mill/eval/Result.scala @@ -4,11 +4,11 @@ sealed trait Result[+T] object Result{ implicit def create[T](t: => T): Result[T] = { try Success(t) - catch { case e: Throwable => Exception(e) } + catch { case e: Throwable => Exception(e, new java.lang.Exception().getStackTrace) } } case class Success[T](value: T) extends Result[T] case object Skipped extends Result[Nothing] sealed trait Failing extends Result[Nothing] case class Failure(msg: String) extends Failing - case class Exception(throwable: Throwable) extends Failing + case class Exception(throwable: Throwable, outerStack: Seq[StackTraceElement]) extends Failing }
\ No newline at end of file diff --git a/core/src/main/scala/mill/main/RunScript.scala b/core/src/main/scala/mill/main/RunScript.scala index 53347fd6..34a569fb 100644 --- a/core/src/main/scala/mill/main/RunScript.scala +++ b/core/src/main/scala/mill/main/RunScript.scala @@ -1,6 +1,6 @@ package mill.main -import java.io.PrintStream +import java.io.{ByteArrayOutputStream, PrintStream} import java.nio.file.NoSuchFileException import ammonite.interp.Interpreter @@ -127,7 +127,8 @@ object RunScript{ case Right(t) => Mirror.renderSelector(t.segments.toList) } val fss = fs.map{ - case Result.Exception(t) => t.toString + case Result.Exception(t, outerStack) => + t.toString + t.getStackTrace.dropRight(outerStack.length).map("\n " + _).mkString case Result.Failure(t) => t } s"$ks ${fss.mkString(", ")}" diff --git a/core/src/test/scala/mill/eval/JavaCompileJarTests.scala b/core/src/test/scala/mill/eval/JavaCompileJarTests.scala index 95ad6669..5ddbb68e 100644 --- a/core/src/test/scala/mill/eval/JavaCompileJarTests.scala +++ b/core/src/test/scala/mill/eval/JavaCompileJarTests.scala @@ -149,7 +149,7 @@ object JavaCompileJarTests extends TestSuite{ ) } - val Left(Result.Exception(ex)) = eval(Build.run("test.BarFour")) + val Left(Result.Exception(ex, _)) = eval(Build.run("test.BarFour")) assert(ex.getMessage.contains("Could not find or load main class")) diff --git a/core/src/test/scala/mill/util/TestUtil.scala b/core/src/test/scala/mill/util/TestUtil.scala index 0457431b..b1e37481 100644 --- a/core/src/test/scala/mill/util/TestUtil.scala +++ b/core/src/test/scala/mill/util/TestUtil.scala @@ -25,7 +25,7 @@ object TestUtil { var exception = Option.empty[Throwable] override def evaluate(args: Ctx) = { failure.map(Result.Failure) orElse - exception.map(Result.Exception) getOrElse + exception.map(Result.Exception(_, Nil)) getOrElse Result.Success(counter + args.args.map(_.asInstanceOf[Int]).sum) } override def sideHash = counter + failure.hashCode() + exception.hashCode() diff --git a/scalalib/src/test/scala/mill/scalalib/HelloWorldTests.scala b/scalalib/src/test/scala/mill/scalalib/HelloWorldTests.scala index 0f4b1223..eb883469 100644 --- a/scalalib/src/test/scala/mill/scalalib/HelloWorldTests.scala +++ b/scalalib/src/test/scala/mill/scalalib/HelloWorldTests.scala @@ -170,7 +170,7 @@ object HelloWorldTests extends TestSuite { 'failOnError - { write.append(mainObject, "val x: ") - val Left(Result.Exception(err)) = helloWorldEvaluator(HelloWorld.compile) + val Left(Result.Exception(err, _)) = helloWorldEvaluator(HelloWorld.compile) assert(err.isInstanceOf[CompileFailed]) @@ -190,7 +190,7 @@ object HelloWorldTests extends TestSuite { } 'passScalacOptions - { // compilation fails because of "-Xfatal-warnings" flag - val Left(Result.Exception(err)) = helloWorldFatalEvaluator(HelloWorldFatalWarnings.compile) + val Left(Result.Exception(err, _)) = helloWorldFatalEvaluator(HelloWorldFatalWarnings.compile) assert(err.isInstanceOf[CompileFailed]) } @@ -232,7 +232,7 @@ object HelloWorldTests extends TestSuite { 'notRunInvalidMainObject - { - val Left(Result.Exception(err)) = helloWorldEvaluator(HelloWorld.runMain("Invalid")) + val Left(Result.Exception(err, _)) = helloWorldEvaluator(HelloWorld.runMain("Invalid")) assert( err.isInstanceOf[InteractiveShelloutException] @@ -241,7 +241,7 @@ object HelloWorldTests extends TestSuite { 'notRunWhenComplileFailed - { write.append(mainObject, "val x: ") - val Left(Result.Exception(err)) = helloWorldEvaluator(HelloWorld.runMain("Main")) + val Left(Result.Exception(err, _)) = helloWorldEvaluator(HelloWorld.runMain("Main")) assert( err.isInstanceOf[CompileFailed] @@ -264,7 +264,7 @@ object HelloWorldTests extends TestSuite { ) } 'notRunWithoutMainClass - { - val Left(Result.Exception(err)) = helloWorldEvaluator(HelloWorld.run()) + val Left(Result.Exception(err, _)) = helloWorldEvaluator(HelloWorld.run()) assert( err.isInstanceOf[RuntimeException] |