metaborg / spoofax-pie

Spoofax implementation using PIE pipelines
Apache License 2.0
12 stars 9 forks source link

Java Compilation does not show error messages for failed annotation processors. #126

Open AZWN opened 1 year ago

AZWN commented 1 year ago

Summary

When compiling a language project, several annotation processor (such as dagger) are executed. However, (error) messages from annotation processors are not reported in the editor.

What you did

  1. Clone the java-front project on this branch.
  2. Import the java8.spoofax3 project in Eclipse.
  3. Build the project.

What actually happened

Now, several errors appear that mb.java8.DaggerJava8Component and mb.java8.DaggerJava8EclipseComponent cannot be resolved. Indeed, these files do not exist in their proper location (build/generated/sources/annotationProcessor/java/main). However, there was no information telling me why these files were not generated.

What you expected to happen

To investigate further, I reproduced the invocation of the compiler on the command-line, which gave the following errors:

// Lots of missing file errors

build/generated/sources/adapter/mb/java8/Java8Component.java:29: error: [Dagger/MissingBinding] mb.statix.referenceretention.stratego.InteropRegisterer cannot be provided without an @Inject constructor or an @Provides-annotated method.
public interface Java8Component extends LanguageComponent  {
       ^
      mb.statix.referenceretention.stratego.InteropRegisterer is injected at
          mb.java8.Java8Module.provideStrategoRuntimeBuilderFactory(…, interopRegisterer0, …)
      mb.java8.Java8StrategoRuntimeBuilderFactory is injected at
          mb.java8.Java8Module.provideQualifiedStrategoRuntimeBuilder(factory)
      @mb.java8.Java8Qualifier("") mb.stratego.common.StrategoRuntimeBuilder is requested at
          mb.java8.Java8Component.getStrategoRuntimeBuilder()
  The following other entry points also depend on it:
      mb.java8.Java8Component.getLanguageInstance()
      mb.java8.Java8Component.getTaskDefs()
      mb.java8.Java8Component.getStrategoRuntimeProvider()
      mb.java8.Java8Component.getJava8GetStrategoRuntimeProvider()
      mb.java8.Java8Component.getJava8Analyze()
      mb.java8.Java8Component.getJava8AnalyzeMulti()
      mb.java8.Java8Component.getJava8AnalyzeFile()
      mb.java8.Java8Component.getJava8ShowPreAnalyzeAst()
      mb.java8.Java8Component.getJava8ShowScopeGraph()
      mb.java8.Java8Component.getJava8ShowScopeGraphAst()
      and 12 others
build/generated/sources/eclipse/mb/java8/Java8EclipseComponent.java:27: error: [Dagger/MissingBinding] mb.statix.referenceretention.stratego.InteropRegisterer cannot be provided without an @Inject constructor or an @Provides-annotated method.
public interface Java8EclipseComponent extends EclipseLanguageComponent, mb.java8.Java8Component {
       ^
      mb.statix.referenceretention.stratego.InteropRegisterer is injected at
          mb.java8.Java8Module.provideStrategoRuntimeBuilderFactory(…, interopRegisterer0, …)
      mb.java8.Java8StrategoRuntimeBuilderFactory is injected at
          mb.java8.Java8Module.provideQualifiedStrategoRuntimeBuilder(factory)
      @mb.java8.Java8Qualifier("") mb.stratego.common.StrategoRuntimeBuilder is requested at
          mb.java8.Java8Component.getStrategoRuntimeBuilder()
  The following other entry points also depend on it:
      mb.java8.Java8Component.getLanguageInstance() [mb.java8.Java8EclipseComponent]
      mb.java8.Java8Component.getTaskDefs() [mb.java8.Java8EclipseComponent]
      mb.java8.Java8Component.getStrategoRuntimeProvider() [mb.java8.Java8EclipseComponent]
      mb.java8.Java8Component.getJava8GetStrategoRuntimeProvider() [mb.java8.Java8EclipseComponent]
      mb.java8.Java8Component.getJava8Analyze() [mb.java8.Java8EclipseComponent]
      mb.java8.Java8Component.getJava8AnalyzeMulti() [mb.java8.Java8EclipseComponent]
      mb.java8.Java8Component.getJava8AnalyzeFile() [mb.java8.Java8EclipseComponent]
      mb.java8.Java8Component.getJava8ShowPreAnalyzeAst() [mb.java8.Java8EclipseComponent]
      mb.java8.Java8Component.getJava8ShowScopeGraph() [mb.java8.Java8EclipseComponent]
      mb.java8.Java8Component.getJava8ShowScopeGraphAst() [mb.java8.Java8EclipseComponent]
      and 12 others

This was the information that I would have liked to see in the editor

Context

Additional information

The manual javac command can be found in java8.spoofax3/run-javac.sh. The classpath and processorpath (which unfortunately use absolute paths) are obtained from setting a breakpoint here, and inspecting the options object.

AZWN commented 1 year ago

The underlying issue was fixed in d825c2f460db43e9f5d5235aeb941a092aa21e1e, so the reproduction scenario does not work in later versions anymore. However, reporting these (and similar) errors in the editor would still be a good idea.