konsoletyper / teavm

Compiles Java bytecode to JavaScript, WebAssembly and C
https://teavm.org
Apache License 2.0
2.55k stars 260 forks source link

Support for SLF4J 2.x #918

Open hohwille opened 1 month ago

hohwille commented 1 month ago

The SLF4J Logger API has been extended in version 2.x and now supports fluent logging: https://www.slf4j.org/manual.html#fluent

When using this in a library that ends up in client code then TeaVM fails with such error:

[INFO] Running TeaVM
[INFO] Output file built with errors
[ERROR] Method org.slf4j.Logger.atLevel(Lorg/slf4j/event/Level;)Lorg/slf4j/spi/LoggingEventBuilder; was not found
    at io.github.mmm.scanner.SimpleTextFormatMessageHandler.log(SimpleTextFormatMessageHandler.java:59)
    at io.github.mmm.scanner.SimpleTextFormatMessageHandler.handle(SimpleTextFormatMessageHandler.java:67)
    at io.github.mmm.base.text.AbstractTextFormatMessageHandler.add(AbstractTextFormatMessageHandler.java:35)
    at io.github.mmm.scanner.AbstractCharStreamScanner.addMessage(AbstractCharStreamScanner.java:129)
    at io.github.mmm.base.text.TextFormatProcessor.addMessage(TextFormatProcessor.java:53)
    at io.github.mmm.base.text.TextFormatProcessor.addWarning(TextFormatProcessor.java:29)
    at io.github.mmm.scanner.AbstractCharStreamScanner.expectOne(AbstractCharStreamScanner.java:594)
    at io.github.mmm.scanner.CharStreamScanner.expectOne(CharStreamScanner.java:786)
    at io.github.mmm.nls.formatter.impl.plugin.NlsFormatterPluginChoice.parseCondition(NlsFormatterPluginChoice.java:149)
    at io.github.mmm.nls.formatter.impl.plugin.NlsFormatterPluginChoice.parseChoice(NlsFormatterPluginChoice.java:111)
    at io.github.mmm.nls.formatter.impl.plugin.NlsFormatterPluginChoice.<init>(NlsFormatterPluginChoice.java:88)
    at io.github.mmm.nls.formatter.impl.NlsFormatterManagerImpl.getFormatter(NlsFormatterManagerImpl.java:66)
    at io.github.mmm.nls.variable.impl.NlsVariableParserImpl.parse(NlsVariableParserImpl.java:45)
    at io.github.mmm.nls.formatter.impl.NlsMessageFormatterImpl.<init>(NlsMessageFormatterImpl.java:51)
    at io.github.mmm.nls.impl.NlsMessageImpl.getLocalizedMessage(NlsMessageImpl.java:94)
    at io.github.mmm.nls.NlsMessage.getLocalizedMessage(NlsMessage.java:92)
    at io.github.mmm.validation.ValidationFailure.getLocalizedMessage(ValidationFailure.java:71)
    at io.github.mmm.ui.spi.widget.AbstractUiNativeWidget.validate(AbstractUiNativeWidget.java:442)
    at io.github.mmm.ui.spi.widget.AbstractUiNativeWidget.validateDown(AbstractUiNativeWidget.java:430)
    at io.github.mmm.ui.api.widget.UiWidget.validate(UiWidget.java:253)
    at io.github.mmm.ui.api.widget.UiWidget.validate(UiWidget.java:235)
    at io.github.mmm.ui.tvm.widget.input.TvmInput.onFocusLoss(TvmInput.java:341)
    at io.github.mmm.ui.tvm.widget.input.TvmRadioChoice$<init>$lambda$_0_1.handleEvent(TvmRadioChoice.java:42)
    at io.github.mmm.ui.tvm.widget.input.TvmRadioChoice$<init>$lambda$_0_1.handleEvent$exported$0

Method atLevel and according stuff needs to be implemented here: https://github.com/konsoletyper/teavm/blob/d40bd9989b36578b08d8f3a58d89070593d7c82e/classlib/src/main/java/org/teavm/classlib/java/util/logging/TLogger.java#L27