diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java index f8298532..abd02c55 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java @@ -18,6 +18,7 @@ import com.sun.source.tree.TypeCastTree; import com.sun.source.tree.TypeParameterTree; import com.sun.source.tree.ParameterizedTypeTree; +import com.sun.source.tree.AnnotatedTypeTree; import javax.tools.Diagnostic; import javax.lang.model.element.Element; @@ -349,12 +350,25 @@ private void resolveNewClassTree(NewClassTree node, TreePath treePath) { if (parentSym == null || parentSym.getKind() != ElementKind.ENUM_CONSTANT) { TreePath identifierTreePath = nodes.get(node.getIdentifier()); Element identifierSym = trees.getElement(identifierTreePath); - emitSymbolOccurrence( - sym, - node, - identifierSym.getSimpleName(), - Role.REFERENCE, - CompilerRange.FROM_TEXT_SEARCH); + // Simplest case, e.g. `new String()` + if (identifierSym != null) { + emitSymbolOccurrence( + sym, + node, + identifierSym.getSimpleName(), + Role.REFERENCE, + CompilerRange.FROM_TEXT_SEARCH); + } + // More complex case, where the type is annotated: `new @TypeParameters String()` + else if (node.getIdentifier().getKind() == Tree.Kind.ANNOTATED_TYPE) { + AnnotatedTypeTree annotatedTypeTree = (AnnotatedTypeTree) node.getIdentifier(); + if (annotatedTypeTree.getUnderlyingType() != null + && annotatedTypeTree.getUnderlyingType().getKind() == Tree.Kind.IDENTIFIER) { + IdentifierTree ident = (IdentifierTree) annotatedTypeTree.getUnderlyingType(); + emitSymbolOccurrence( + sym, ident, ident.getName(), Role.REFERENCE, CompilerRange.FROM_TEXT_SEARCH); + } + } } } } diff --git a/tests/minimized/src/main/java/minimized/TypeAnnotations.java b/tests/minimized/src/main/java/minimized/TypeAnnotations.java new file mode 100644 index 00000000..9ddf6a8d --- /dev/null +++ b/tests/minimized/src/main/java/minimized/TypeAnnotations.java @@ -0,0 +1,17 @@ +package minimized; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target({ ElementType.TYPE_USE }) +@interface TypeAnnotation { + int integer() default 1; +} + +// FIXME(issue: GRAPH-1122): Definition range for T below is incorrect +class ClassProcessed<@TypeAnnotation T extends Number> { + + public ClassProcessed() { + String s = new @TypeAnnotation String(); + } +} diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TypeAnnotations.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TypeAnnotations.java new file mode 100644 index 00000000..4bc4407e --- /dev/null +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TypeAnnotations.java @@ -0,0 +1,60 @@ +package minimized; + +import java.lang.annotation.ElementType; +// ^^^^ reference semanticdb maven . . java/ +// ^^^^ reference semanticdb maven . . java/lang/ +// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/ +// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType# +import java.lang.annotation.Target; +// ^^^^ reference semanticdb maven . . java/ +// ^^^^ reference semanticdb maven . . java/lang/ +// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/ +// ^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Target# + +@Target({ ElementType.TYPE_USE }) +//^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Target# +// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType# +// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#TYPE_USE. +@interface TypeAnnotation { +// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/TypeAnnotation# +// display_name TypeAnnotation +// signature_documentation java @Target({ElementType.TYPE_USE})\n@interface TypeAnnotation +// kind Interface +// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation# + int integer() default 1; +// ^^^^^^^ definition semanticdb maven . . minimized/TypeAnnotation#integer(). +// display_name integer +// signature_documentation java public abstract int integer() +// kind AbstractMethod +} + +// FIXME(issue: GRAPH-1122): Definition range for T below is incorrect +class ClassProcessed<@TypeAnnotation T extends Number> { +// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ClassProcessed# +// display_name ClassProcessed +// signature_documentation java class ClassProcessed +// kind Class +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ClassProcessed#[T] +// display_name T +// signature_documentation java T extends Number +// kind TypeParameter +// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/TypeAnnotation# +// ^^^^^^ reference semanticdb maven jdk 11 java/lang/Number# + + public ClassProcessed() { +// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ClassProcessed#``(). +// display_name +// signature_documentation java public ClassProcessed() +// kind Constructor + String s = new @TypeAnnotation String(); +// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^ definition local 0 +// display_name s +// signature_documentation java String s +// enclosing_symbol semanticdb maven . . minimized/ClassProcessed#``(). +// kind Variable +// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/TypeAnnotation# +// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String#``(). + } +}