From a5f3e1b83929c8617867cf2b7ab14f7a2df93e17 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Sun, 3 Apr 2011 21:08:06 -0400 Subject: [PATCH] clean up build definition exceptions and messages --- compile/Eval.scala | 6 +++--- main/Build.scala | 12 +++++++++--- main/Main.scala | 5 ++++- main/MessageOnlyException.scala | 7 +++++++ 4 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 main/MessageOnlyException.scala diff --git a/compile/Eval.scala b/compile/Eval.scala index 02a96a957..0b14a02a0 100644 --- a/compile/Eval.scala +++ b/compile/Eval.scala @@ -94,7 +94,7 @@ final class Eval(optionsNoncp: Seq[String], classpath: Seq[File], mkReporter: Se } compile(run.namerPhase) - checkError("Type error.") + checkError("Type error in expression") val tpe = atPhase(run.typerPhase.next) { (new TypeExtractor).getType(unit.body) } (tpe, load(dir, moduleName)) @@ -163,7 +163,7 @@ final class Eval(optionsNoncp: Seq[String], classpath: Seq[File], mkReporter: Se val tpeParser = new syntaxAnalyzer.UnitParser(mkUnit("", DefaultStartLine, tpe)) val tpt0: Tree = tpeParser.typ() tpeParser.accept(EOF) - checkError("Error parsing type.") + checkError("Error parsing expression type.") tpt0 } private[this] def parseImports(imports: EvalImports): Seq[Tree] = @@ -173,7 +173,7 @@ final class Eval(optionsNoncp: Seq[String], classpath: Seq[File], mkReporter: Se val parser = new syntaxAnalyzer.UnitParser(importUnit) val trees: Seq[Tree] = parser.importClause() parser.accept(EOF) - checkError("Error parsing imports.") + checkError("Error parsing imports for expression.") trees } diff --git a/main/Build.scala b/main/Build.scala index c148698ce..03e063311 100644 --- a/main/Build.scala +++ b/main/Build.scala @@ -73,7 +73,11 @@ object EvaluateConfigurations def evaluateSetting(eval: Eval, name: String, imports: Seq[(String,Int)], expression: String, line: Int): Setting[_] = { - val result = eval.eval(expression, imports = new EvalImports(imports, name), srcName = name, tpeName = Some("sbt.Project.Setting[_]"), line = line) + val result = try { + eval.eval(expression, imports = new EvalImports(imports, name), srcName = name, tpeName = Some("sbt.Project.Setting[_]"), line = line) + } catch { + case e: sbt.compiler.EvalException => throw new MessageOnlyException(e.getMessage) + } result.value.asInstanceOf[Setting[_]] } private[this] def fstS(f: String => Boolean): ((String,Int)) => Boolean = { case (s,i) => f(s) } @@ -570,8 +574,10 @@ object Load def build(classpath: Seq[File], sources: Seq[File], target: File, compilers: Compilers, log: Logger): (Inputs, inc.Analysis) = { - val inputs = Compiler.inputs(classpath, sources, target, Nil, Nil, Compiler.DefaultMaxErrors)(compilers, log) - val analysis = Compiler(inputs, log) + val inputs = Compiler.inputs(classpath, sources, target, Nil, Nil, Compiler.DefaultMaxErrors, CompileOrder.Mixed)(compilers, log) + val analysis = + try { Compiler(inputs, log) } + catch { case _: xsbti.CompileFailed => throw new NoMessageException } // compiler already logged errors (inputs, analysis) } diff --git a/main/Main.scala b/main/Main.scala index bdc31f027..4fa8766e2 100644 --- a/main/Main.scala +++ b/main/Main.scala @@ -332,7 +332,10 @@ object BuiltinCommands { e match { - case i: Incomplete => () // already handled by evaluateTask + case _: Incomplete => () // already handled by evaluateTask + case _: NoMessageException => () + case _: MessageOnlyException => + log.error(e.toString) case _ => log.trace(e) log.error(e.toString) diff --git a/main/MessageOnlyException.scala b/main/MessageOnlyException.scala new file mode 100644 index 000000000..6791a9339 --- /dev/null +++ b/main/MessageOnlyException.scala @@ -0,0 +1,7 @@ +/* sbt -- Simple Build Tool + * Copyright 2011 Mark Harrah + */ +package sbt + +final class MessageOnlyException(override val toString: String) extends RuntimeException(toString) +final class NoMessageException extends RuntimeException \ No newline at end of file