summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-01-01 17:47:08 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-01-01 17:47:44 -0800
commit6074133396839db40e37aa3c0935edf875d4beba (patch)
treed9bfb61e7201c3d77a1f1bbad21f29f7a021e31c
parente1241f1da8e55cfba3286c438ac26e4d09df63ff (diff)
downloadmill-6074133396839db40e37aa3c0935edf875d4beba.tar.gz
mill-6074133396839db40e37aa3c0935edf875d4beba.tar.bz2
mill-6074133396839db40e37aa3c0935edf875d4beba.zip
Fix `idea` project generation, and make `Result.Exception` display the offending stack trace so they're easier to debug
-rw-r--r--core/src/main/scala/mill/eval/Evaluator.scala6
-rw-r--r--core/src/main/scala/mill/eval/Result.scala4
-rw-r--r--core/src/main/scala/mill/main/RunScript.scala5
-rw-r--r--core/src/test/scala/mill/eval/JavaCompileJarTests.scala2
-rw-r--r--core/src/test/scala/mill/util/TestUtil.scala2
-rw-r--r--scalalib/src/test/scala/mill/scalalib/HelloWorldTests.scala10
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]