eclipse-jdt / eclipse-jdt/eclipse.jdt.core

NPE in TypesImpl.isSameType during FreeBuilder annotation processing

Open
#1,266 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.