Skip to content

AssertionError when annotation is placed on Type element #9537

Description

@matthiasblaesing

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

Metadata

Metadata

Assignees

Labels

Java[ci] enable extra Java tests (java.completion, java.source.base, java.hints, refactoring.java, form)kind:bugBug report or fixnb-javacRun nb-javac integration tests

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions