mirror of
https://github.com/enso-org/enso.git
synced 2024-12-26 01:42:45 +03:00
31e3f39c55
This change introduces a custom LogManager for console that allows for excluding certain log messages. The primarily reason for introducing such LogManager/Appender is to stop issuing hundreds of pointless warnings coming from the analyzing compiler (wrapper around javac) for classes that are being generated by annotation processors. The output looks like this: ``` [info] Cannot install GraalVM MBean due to Failed to load org.graalvm.nativebridge.jni.JNIExceptionWrapperEntryPoints [info] compiling 129 Scala sources and 395 Java sources to /home/hubert/work/repos/enso/enso/engine/runtime/target/scala-2.13/classes ... [warn] Unexpected javac output: warning: File for type 'org.enso.interpreter.runtime.type.ConstantsGen' created in the last round will not be subject to annotation processing. [warn] 1 warning. [info] [Use -Dgraal.LogFile=<path> to redirect Graal log output to a file.] [info] Cannot install GraalVM MBean due to Failed to load org.graalvm.nativebridge.jni.JNIExceptionWrapperEntryPoints [info] foojavac Filer [warn] Could not determine source for class org.enso.interpreter.node.expression.builtin.number.decimal.CeilMethodGen [warn] Could not determine source for class org.enso.interpreter.node.expression.builtin.resource.TakeNodeGen [warn] Could not determine source for class org.enso.interpreter.node.expression.builtin.error.ThrowErrorMethodGen [warn] Could not determine source for class org.enso.interpreter.node.expression.builtin.number.smallInteger.MultiplyMethodGen [warn] Could not determine source for class org.enso.interpreter.node.expression.builtin.warning.GetWarningsNodeGen [warn] Could not determine source for class org.enso.interpreter.node.expression.builtin.number.smallInteger.BitAndMethodGen [warn] Could not determine source for class org.enso.interpreter.node.expression.builtin.error.ErrorToTextNodeGen [warn] Could not determine source for class org.enso.interpreter.node.expression.builtin.warning.GetValueMethodGen [warn] Could not determine source for class org.enso.interpreter.runtime.callable.atom.AtomGen$MethodDispatchLibraryExports$Cached .... ``` The output now has over 500 of those and there will be more. Much more (generated by our and Truffle processors). There is no way to tell SBT that those are OK. One could potentially think of splitting compilation into 3 stages (Java processors, Java and Scala) but that will already complicate the non-trivial build definition and we may still end up with the initial problem. This is a fix to make it possible to get reasonable feedback from compilation without scrolling mutliple screens *every single time*. Also fixed a spurious warning in javac processor complaining about creating files in the last round. Related to https://www.pivotaltracker.com/story/show/182138198
34 lines
1.5 KiB
Scala
34 lines
1.5 KiB
Scala
package sbt.internal.util
|
|
|
|
import sbt.internal.LogManager
|
|
import sbt.internal.util.ConsoleAppender.{Properties, noSuppressedMessage}
|
|
|
|
object CustomLogManager {
|
|
def excludeMsg(msgPrefix: String, level: sbt.Level.Value): LogManager = {
|
|
sbt.internal.LogManager.
|
|
withLoggers((_, _) => new CustomAppender(level, msgPrefix, ConsoleOut.systemOut))
|
|
}
|
|
|
|
/**
|
|
* Returns a custom ConsoleAppender that will skip log messages starting with a certain prefix.
|
|
*
|
|
* The only reason for such appender is to force SBT to keep quiet about certain kind of messages
|
|
* coming from the analyzing compiler (wrapper around java compiler) when it tries to match class files
|
|
* to source files. There is absolutely no way to tell SBT that that some sources are being generated from
|
|
* annotation processors and it will get them during the same compilation round. Nor can we easily
|
|
* suppress such warning.
|
|
*
|
|
* @param excludeLevel level of log message to exclude (together with prefix)
|
|
* @param prefix prefix of log message to exclude (together with log level)
|
|
* @param out object representing console output
|
|
*/
|
|
private final class CustomAppender(excludeLevel: sbt.Level.Value, prefix: String, out: ConsoleOut)
|
|
extends ConsoleAppender("out", Properties.from(out, Terminal.isAnsiSupported, Terminal.isAnsiSupported), noSuppressedMessage) {
|
|
override def appendLog(level: sbt.Level.Value, message: => String): Unit = {
|
|
if (excludeLevel != level || !message.startsWith(prefix)) {
|
|
super.appendLog(level, message)
|
|
}
|
|
}
|
|
}
|
|
}
|