Apache NetBeans version
Apache NetBeans 32 latest daily build
What happened
I invoked code completion on a variable that was declared as var and where the actual type of the variable was a CompletableFuture. On the generic type information a @nonnull annotation was used.
The result of that invocation is an AssertionError from inside javac:
java.lang.AssertionError
at com.sun.tools.javac.util.Assert.error(Assert.java:155)
at com.sun.tools.javac.util.Assert.checkNonNull(Assert.java:62)
at com.sun.tools.javac.comp.Annotate.fromAnnotations(Annotate.java:163)
at com.sun.tools.javac.comp.Annotate.lambda$annotateTypeSecondStage$0(Annotate.java:1057)
at com.sun.tools.javac.comp.Annotate.flush(Annotate.java:194)
at com.sun.tools.javac.code.ClassFinder.complete(ClassFinder.java:322)
at org.netbeans.lib.nbjavac.services.NBClassFinder.lambda$getCompleter$0(NBClassFinder.java:100)
at com.sun.tools.javac.code.Symbol.complete(Symbol.java:703)
at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1472)
at com.sun.tools.javac.code.Symbol.apiComplete(Symbol.java:709)
at com.sun.tools.javac.code.Symbol$ClassSymbol.getInterfaces(Symbol.java:1484)
at com.sun.tools.javac.code.Types$16.visitClassType(Types.java:2642)
at com.sun.tools.javac.code.Types$16.visitClassType(Types.java:2633)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:1056)
at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:5058)
at com.sun.tools.javac.code.Types.interfaces(Types.java:2630)
at com.sun.tools.javac.code.Types$MembersClosureCache.visitClassType(Types.java:3115)
at com.sun.tools.javac.code.Types$MembersClosureCache.visitClassType(Types.java:3055)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:1056)
at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4978)
at com.sun.tools.javac.code.Types$MembersClosureCache.visitClassType(Types.java:3116)
at com.sun.tools.javac.code.Types$MembersClosureCache.visitClassType(Types.java:3055)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:1056)
at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4978)
at com.sun.tools.javac.code.Types.membersClosure(Types.java:3138)
at com.sun.tools.javac.code.Types$ImplementationCache.get(Types.java:3012)
at com.sun.tools.javac.code.Types.implementation(Types.java:3050)
at com.sun.tools.javac.code.Symbol$MethodSymbol.implementation(Symbol.java:2239)
at com.sun.tools.javac.code.Symbol$MethodSymbol.implementation(Symbol.java:2232)
at com.sun.tools.javac.comp.Resolve.notOverriddenIn(Resolve.java:483)
at com.sun.tools.javac.comp.Resolve.selectBest(Resolve.java:1598)
at com.sun.tools.javac.comp.Resolve.findMethodInScope(Resolve.java:1814)
at com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1889)
at com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1858)
at com.sun.tools.javac.comp.Resolve$12.lookup(Resolve.java:2831)
at com.sun.tools.javac.comp.Resolve.lookupMethod(Resolve.java:3793)
at com.sun.tools.javac.comp.Resolve.resolveQualifiedMethod(Resolve.java:2828)
at com.sun.tools.javac.comp.Resolve.resolveQualifiedMethod(Resolve.java:2818)
at com.sun.tools.javac.comp.Attr.selectSym(Attr.java:4561)
at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4449)
at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2601)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:679)
at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2665)
at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1885)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:679)
at com.sun.tools.javac.comp.Attr.visitReturn(Attr.java:2525)
at com.sun.tools.javac.tree.JCTree$JCReturn.accept(JCTree.java:1797)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:679)
at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:757)
at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:776)
at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:1466)
at org.netbeans.lib.nbjavac.services.NBAttr.visitBlock(NBAttr.java:94)
at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1161)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:679)
at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:757)
at com.sun.tools.javac.comp.Attr.visitIf(Attr.java:2297)
at com.sun.tools.javac.tree.JCTree$JCIf.accept(JCTree.java:1641)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:679)
at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:757)
at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:776)
at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:1466)
at org.netbeans.lib.nbjavac.services.NBAttr.visitBlock(NBAttr.java:94)
at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1161)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:679)
at com.sun.tools.javac.comp.DeferredAttr.attribSpeculative(DeferredAttr.java:530)
at com.sun.tools.javac.comp.Attr.attribToTree(Attr.java:430)
at com.sun.tools.javac.comp.Attr.attribStatToTree(Attr.java:423)
at org.netbeans.lib.nbjavac.services.NBAttr.attribStatToTree(NBAttr.java:148)
at com.sun.tools.javac.api.JavacTrees.attribStatToTree(JavacTrees.java:910)
at com.sun.tools.javac.api.JavacTrees.getAttrContext(JavacTrees.java:885)
at com.sun.tools.javac.api.JavacTrees.getScope(JavacTrees.java:751)
at org.netbeans.lib.nbjavac.services.NBJavacTrees.getScope(NBJavacTrees.java:110)
at org.netbeans.lib.nbjavac.services.NBJavacTrees.getScope(NBJavacTrees.java:48)
at org.netbeans.modules.java.completion.BaseTask.getEnvImpl(BaseTask.java:359)
at org.netbeans.modules.java.completion.BaseTask.getCompletionEnvironment(BaseTask.java:279)
at org.netbeans.modules.java.completion.JavaCompletionTask.resolve(JavaCompletionTask.java:302)
at org.netbeans.modules.java.completion.BaseTask.run(BaseTask.java:96)
at org.netbeans.modules.java.completion.JavaCompletionTask.run(JavaCompletionTask.java:67)
at org.netbeans.modules.parsing.impl.TaskProcessor.callUserTask(TaskProcessor.java:586)
at org.netbeans.modules.parsing.api.ParserManager$UserTaskAction.run(ParserManager.java:197)
at org.netbeans.modules.parsing.api.ParserManager$UserTaskAction.run(ParserManager.java:180)
at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:181)
at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:178)
at org.netbeans.modules.masterfs.filebasedfs.utils.FileChangedManager.priorityIO(FileChangedManager.java:153)
at org.netbeans.modules.masterfs.providers.ProvidedExtensions.priorityIO(ProvidedExtensions.java:341)
at org.netbeans.modules.parsing.nb.DataObjectEnvFactory.runPriorityIO(DataObjectEnvFactory.java:118)
at org.netbeans.modules.parsing.impl.Utilities.runPriorityIO(Utilities.java:67)
at org.netbeans.modules.parsing.impl.TaskProcessor.runUserTask(TaskProcessor.java:178)
at org.netbeans.modules.parsing.api.ParserManager.parse(ParserManager.java:83)
at org.netbeans.modules.editor.java.JavaCompletionProvider$JavaCompletionQuery.query(JavaCompletionProvider.java:193)
at org.netbeans.spi.editor.completion.support.AsyncCompletionTask.run(AsyncCompletionTask.java:198)
at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1370)
at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45)
at org.openide.util.lookup.Lookups.executeWith(Lookups.java:287)
[catch] at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:1981)
Language / Project Type / NetBeans Component
Java Maven Application
How to reproduce
The original problem was observed in the OpenHAB Add-Ons repository:
https://github.com/openhab/openhab-addons/blob/fdb6211eee5a129cab19ed85a8a2a7398798fce8/bundles/org.openhab.binding.bluetooth.bluez/src/main/java/org/openhab/binding/bluetooth/bluez/internal/DeviceManagerFactory.java#L61-L68
After the if-Block insert a new line, enter future., the exception triggers immediately.
I tried to create a minimal reproducer and a maven project with org.eclipse.jdt.annotation configured and this code shows a slightly different stack trace, but judging from the end of the trace it looks like the same problem. Full project: hint_type_annotation.zip:
package eu.doppelhelix.test.hint_type_annotation;
import java.util.ArrayList;
import org.eclipse.jdt.annotation.NonNull;
public class HintTypeAnnotation {
public void main(String[] args) {
var future = new ArrayList<@NonNull String>();
}
}
create a new line in main and enter future. and you'll get this trace:
java.lang.AssertionError
at com.sun.tools.javac.util.Assert.error(Assert.java:155)
at com.sun.tools.javac.util.Assert.checkNonNull(Assert.java:62)
at com.sun.tools.javac.comp.Annotate.fromAnnotations(Annotate.java:163)
at com.sun.tools.javac.comp.Annotate.lambda$annotateTypeSecondStage$0(Annotate.java:1057)
at com.sun.tools.javac.comp.Annotate.flush(Annotate.java:194)
at com.sun.tools.javac.code.ClassFinder.complete(ClassFinder.java:322)
at org.netbeans.lib.nbjavac.services.NBClassFinder.lambda$getCompleter$0(NBClassFinder.java:100)
at com.sun.tools.javac.code.Symbol.complete(Symbol.java:703)
at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1472)
at com.sun.tools.javac.code.Symbol.apiComplete(Symbol.java:709)
at com.sun.tools.javac.jvm.ClassReader$1.getEnclosingType(ClassReader.java:616)
at com.sun.tools.javac.code.Type$StructuralTypeMapping.visitClassType(Type.java:243)
at com.sun.tools.javac.code.Types$Subst.visitClassType(Types.java:3404)
at com.sun.tools.javac.code.Types$Subst.visitClassType(Types.java:3370)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:1056)
at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4978)
at com.sun.tools.javac.code.Types$TypeMapping.lambda$visit$0(Types.java:5086)
at com.sun.tools.javac.util.List.map(List.java:428)
at com.sun.tools.javac.code.Types$TypeMapping.visit(Types.java:5086)
at com.sun.tools.javac.code.Type$StructuralTypeMapping.visitMethodType(Type.java:290)
at com.sun.tools.javac.code.Type$StructuralTypeMapping.visitMethodType(Type.java:239)
at com.sun.tools.javac.code.Type$MethodType.accept(Type.java:1502)
at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4978)
at com.sun.tools.javac.code.Type.map(Type.java:319)
at com.sun.tools.javac.code.Types.subst(Types.java:3363)
at com.sun.tools.javac.code.Types$13.visitClassType(Types.java:2357)
at com.sun.tools.javac.code.Types$13.visitClassType(Types.java:2328)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:1056)
at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4978)
at com.sun.tools.javac.code.Types.memberType(Types.java:2325)
at com.sun.tools.javac.code.Symbol$MethodSymbol.overrides(Symbol.java:2158)
at com.sun.tools.javac.code.Symbol$MethodSymbol.overrides(Symbol.java:2132)
at com.sun.tools.javac.model.JavacElements.overrides(JavacElements.java:698)
at com.sun.tools.javac.model.JavacElements.addMembers(JavacElements.java:571)
at com.sun.tools.javac.model.JavacElements.getAllMembers(JavacElements.java:561)
at com.sun.tools.javac.model.JavacElements.getAllMembers(JavacElements.java:90)
at org.netbeans.api.java.source.ElementUtilities.getMembers(ElementUtilities.java:241)
at org.netbeans.modules.java.completion.JavaCompletionTask.addMembers(JavaCompletionTask.java:4223)
at org.netbeans.modules.java.completion.JavaCompletionTask.insideMemberSelect(JavaCompletionTask.java:1936)
at org.netbeans.modules.java.completion.JavaCompletionTask.resolve(JavaCompletionTask.java:380)
at org.netbeans.modules.java.completion.BaseTask.run(BaseTask.java:96)
at org.netbeans.modules.java.completion.JavaCompletionTask.run(JavaCompletionTask.java:67)
at org.netbeans.modules.parsing.impl.TaskProcessor.callUserTask(TaskProcessor.java:586)
at org.netbeans.modules.parsing.api.ParserManager$UserTaskAction.run(ParserManager.java:197)
at org.netbeans.modules.parsing.api.ParserManager$UserTaskAction.run(ParserManager.java:180)
at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:181)
at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:178)
at org.netbeans.modules.masterfs.filebasedfs.utils.FileChangedManager.priorityIO(FileChangedManager.java:153)
at org.netbeans.modules.masterfs.providers.ProvidedExtensions.priorityIO(ProvidedExtensions.java:341)
at org.netbeans.modules.parsing.nb.DataObjectEnvFactory.runPriorityIO(DataObjectEnvFactory.java:118)
at org.netbeans.modules.parsing.impl.Utilities.runPriorityIO(Utilities.java:67)
at org.netbeans.modules.parsing.impl.TaskProcessor.runUserTask(TaskProcessor.java:178)
at org.netbeans.modules.parsing.api.ParserManager.parse(ParserManager.java:83)
at org.netbeans.modules.editor.java.JavaCompletionProvider$JavaCompletionQuery.query(JavaCompletionProvider.java:193)
at org.netbeans.spi.editor.completion.support.AsyncCompletionTask.run(AsyncCompletionTask.java:198)
at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1370)
at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45)
at org.openide.util.lookup.Lookups.executeWith(Lookups.java:287)
[catch] at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:1981)
Did this work correctly in an earlier version?
No / Don't know
Operating System
Linux
JDK
OpenJDK 25
Apache NetBeans packaging
Own source build
Anything else
No response
Are you willing to submit a pull request?
No
Apache NetBeans version
Apache NetBeans 32 latest daily build
What happened
I invoked code completion on a variable that was declared as
varand where the actual type of the variable was a CompletableFuture. On the generic type information a @nonnull annotation was used.The result of that invocation is an AssertionError from inside javac:
Language / Project Type / NetBeans Component
Java Maven Application
How to reproduce
The original problem was observed in the OpenHAB Add-Ons repository:
https://github.com/openhab/openhab-addons/blob/fdb6211eee5a129cab19ed85a8a2a7398798fce8/bundles/org.openhab.binding.bluetooth.bluez/src/main/java/org/openhab/binding/bluetooth/bluez/internal/DeviceManagerFactory.java#L61-L68
After the if-Block insert a new line, enter
future., the exception triggers immediately.I tried to create a minimal reproducer and a maven project with
org.eclipse.jdt.annotationconfigured and this code shows a slightly different stack trace, but judging from the end of the trace it looks like the same problem. Full project: hint_type_annotation.zip:create a new line in
mainand enterfuture.and you'll get this trace:Did this work correctly in an earlier version?
No / Don't know
Operating System
Linux
JDK
OpenJDK 25
Apache NetBeans packaging
Own source build
Anything else
No response
Are you willing to submit a pull request?
No