diff options
author | Christopher Vogt <oss.nsp@cvogt.org> | 2016-10-13 01:29:48 +0000 |
---|---|---|
committer | Christopher Vogt <oss.nsp@cvogt.org> | 2016-10-13 23:21:04 -0400 |
commit | cf94008b6fded5f58cea764d48beb0dcbbd4bb97 (patch) | |
tree | 5a26f2e2c50e7d5776a56c86dba62a5f129ed45f /stage1/Stage1Lib.scala | |
parent | e7dab60a0a38f40b75b919a91b73052b510f1711 (diff) | |
download | cbt-cf94008b6fded5f58cea764d48beb0dcbbd4bb97.tar.gz cbt-cf94008b6fded5f58cea764d48beb0dcbbd4bb97.tar.bz2 cbt-cf94008b6fded5f58cea764d48beb0dcbbd4bb97.zip |
swap out System.out and System.err in a way that affects JDK and Scala
Before it only affected jdk, because scala.Console captures our and err
before the swap.
This is needed when running main classes like Scaladoc or the compiler
and wanting to redirect output to standard error
Diffstat (limited to 'stage1/Stage1Lib.scala')
-rw-r--r-- | stage1/Stage1Lib.scala | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/stage1/Stage1Lib.scala b/stage1/Stage1Lib.scala index 68648fe..273b9af 100644 --- a/stage1/Stage1Lib.scala +++ b/stage1/Stage1Lib.scala @@ -302,13 +302,36 @@ class Stage1Lib( val logger: Logger ) extends BaseLib{ } } def redirectOutToErr[T](code: => T): T = { - val oldOut = System.out - try{ - System.setOut(System.err) - code - } finally{ - System.setOut(oldOut) + val ( out, err ) = try{ + // trying nailgun's System.our/err wrapper + val field = System.out.getClass.getDeclaredField("streams") + assert(System.out.getClass.getName == "com.martiansoftware.nailgun.ThreadLocalPrintStream") + assert(System.err.getClass.getName == "com.martiansoftware.nailgun.ThreadLocalPrintStream") + field.setAccessible(true) + val out = field.get(System.out).asInstanceOf[ThreadLocal[PrintStream]] + val err = field.get(System.err).asInstanceOf[ThreadLocal[PrintStream]] + ( out, err ) + } catch { + case e: NoSuchFieldException => + // trying cbt's System.our/err wrapper + val field = classOf[FilterOutputStream].getDeclaredField("out") + field.setAccessible(true) + val outStream = field.get(System.out) + val errStream = field.get(System.err) + assert(outStream.getClass.getName == "cbt.ThreadLocalOutputStream") + assert(errStream.getClass.getName == "cbt.ThreadLocalOutputStream") + val field2 = outStream.getClass.getDeclaredField("threadLocal") + field2.setAccessible(true) + val out = field2.get(outStream).asInstanceOf[ThreadLocal[PrintStream]] + val err = field2.get(errStream).asInstanceOf[ThreadLocal[PrintStream]] + ( out, err ) } + + val oldOut: PrintStream = out.get + out.set( err.get: PrintStream ) + val res = code + out.set( oldOut ) + res } def trapExitCode( code: => ExitCode ): ExitCode = { |