enso/project/CustomLogManager.scala
Hubert Plociniczak 31e3f39c55
Suppress pointless warnings coming from SBT (#3499)
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
2022-06-01 13:50:46 +00:00

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)
}
}
}
}