eclipse-jdt / eclipse-jdt/eclipse.jdt.core
NPE in TypesImpl.isSameType during FreeBuilder annotation processing
- Dominant language
- Java
- Stars
- 237
- Forks
- 195
- Avg merge
- 1d 12h
- Merged PRs (30d)
- 47
Description
Hi, I am trying to work on a codebase that uses the popular FreeBuilder library (https://github.com/inferred/FreeBuilder)
When declaring a nested type like this:
```java
public class FreeBuildersTest {
@FreeBuilder
public interface Value {
X x();
class Builder extends FreeBuildersTest_Value_Builder {}
}
}
```
the annotation processor encounters an exception in Eclipse.
With javac, the code successfully compiles as expected.
```
Internal error: java.lang.NullPointerException: Cannot invoke "org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding.isParameterizedType()" because the return value of "org.eclipse.jdt.internal.compiler.lookup.RawTypeBinding.enclosingType()" is null
at org.eclipse.jdt.internal.compiler.lookup.RawTypeBinding.computeUniqueKey(RawTypeBinding.java:71)
at org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding.computeUniqueKey(ParameterizedTypeBinding.java:376)
at org.eclipse.jdt.internal.compiler.lookup.Binding.computeUniqueKey(Binding.java:137)
at org.eclipse.jdt.internal.compiler.apt.model.TypesImpl.isSameType(TypesImpl.java:516)
at org.inferred.freebuilder.processor.NamePicker.pickName(NamePicker.java:66)
at org.inferred.freebuilder.processor.Analyser.analyse(Analyser.java:150)
at org.inferred.freebuilder.processor.Processor.process(Processor.java:106)
at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:142)
at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.java:124)
at org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:172)
at org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.processAnnotations(IdeAnnotationProcessorManager.java:138)
at org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:953)
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:450)
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:426)
at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:401)
at org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.compile(IncrementalImageBuilder.java:371)
at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:333)
at org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.incrementalBuildLoop(IncrementalImageBuilder.java:190)
at org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.build(IncrementalImageBuilder.java:147)
at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildDeltas(JavaBuilder.java:290)
at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:213)
at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:1020)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:247)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:303)
at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:392)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:395)
at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:506)
at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:454)
at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:536)
at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:196)
at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:289)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
```
I inspected the frame where FreeBuilder's `NamePicker` calls `Types.isSameType` and both of the passed types seem sensible (non-null and have a toString at least), but clearly under the hood some important field is unexpectedly null.
Affects: Eclipse JDT 3.19.100.v20230605-0440 Platform 4.28.0.v20230605-0440
This issue can be reproduced with this linked project:
https://github.com/stevenschlansker/eclipse-freebuilder-fail
Clone the repository, import into Eclipse as a Maven project.
Run `mvn clean compile` and observe javac succeed. Run a clean build in Eclipse, and you should get the above failure.
Please let me know if I can provide more information.
Contributor guide
Assessment
This issue has not been assessed yet.