From 0831552dc522cdb401047bb088e91ce63cff812a Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Sun, 26 Jun 2011 12:27:06 -0400 Subject: [PATCH] apply javac log level approach to directJavac --- compile/JavaCompiler.scala | 13 ++++++++----- util/log/LoggerWriter.scala | 17 ++++++++++++++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/compile/JavaCompiler.scala b/compile/JavaCompiler.scala index 421b0fc30..6cdb46855 100644 --- a/compile/JavaCompiler.scala +++ b/compile/JavaCompiler.scala @@ -51,14 +51,17 @@ object JavaCompiler } val directJavac = (arguments: Seq[String], log: Logger) => { - val writer = new java.io.PrintWriter(new LoggerWriter(log, Level.Error)) + val logger = new LoggerWriter(log) + val writer = new java.io.PrintWriter(logger) val argsArray = arguments.toArray val javac = Class.forName("com.sun.tools.javac.Main") log.debug("Calling javac directly.") - javac.getDeclaredMethod("compile", classOf[Array[String]], classOf[java.io.PrintWriter]) - .invoke(null, argsArray, writer) - .asInstanceOf[java.lang.Integer] - .intValue + val compileMethod = javac.getDeclaredMethod("compile", classOf[Array[String]], classOf[java.io.PrintWriter]) + + var exitCode = -1 + try { exitCode = compileMethod.invoke(null, argsArray, writer).asInstanceOf[java.lang.Integer].intValue } + finally { logger.flushLines( if(exitCode == 0) Level.Warn else Level.Error) } + exitCode } def withArgumentFile[T](args: Seq[String])(f: File => T): T = { diff --git a/util/log/LoggerWriter.scala b/util/log/LoggerWriter.scala index 81c0d89d0..aeb67ce72 100644 --- a/util/log/LoggerWriter.scala +++ b/util/log/LoggerWriter.scala @@ -5,11 +5,13 @@ package sbt /** Provides a `java.io.Writer` interface to a `Logger`. Content is line-buffered and logged at `level`. * A line is delimited by `nl`, which is by default the platform line separator.*/ -class LoggerWriter(delegate: Logger, level: Level.Value, nl: String) extends java.io.Writer +class LoggerWriter(delegate: Logger, unbufferedLevel: Option[Level.Value], nl: String = System.getProperty("line.separator")) extends java.io.Writer { - def this(delegate: Logger, level: Level.Value) = this(delegate, level, System.getProperty("line.separator")) + def this(delegate: Logger, level: Level.Value) = this(delegate, Some(level)) + def this(delegate: Logger) = this(delegate, None) private[this] val buffer = new StringBuilder + private[this] val lines = new collection.mutable.ListBuffer[String] override def close() = flush() override def flush(): Unit = @@ -20,6 +22,12 @@ class LoggerWriter(delegate: Logger, level: Level.Value, nl: String) extends jav buffer.clear() } } + def flushLines(level: Level.Value): Unit = + synchronized { + for(line <- lines) + delegate.log(level, line) + lines.clear() + } override def write(content: Array[Char], offset: Int, length: Int): Unit = synchronized { buffer.appendAll(content, offset, length) @@ -36,5 +44,8 @@ class LoggerWriter(delegate: Logger, level: Level.Value, nl: String) extends jav process() } } - private[this] def log(s: String): Unit = delegate.log(level, s) + private[this] def log(s: String): Unit = unbufferedLevel match { + case None => lines += s + case Some(level) => delegate.log(level, s) + } } \ No newline at end of file