From cfeb05d202c6376362885b7ef52cf060ef2e23bc Mon Sep 17 00:00:00 2001 From: Anton Sviridov Date: Tue, 25 Feb 2025 11:35:39 +0000 Subject: [PATCH 1/5] Fix annotated types in new class expression --- .../semanticdb_javac/SemanticdbVisitor.java | 26 ++++++-- .../main/java/minimized/TypeAnnotations.java | 16 +++++ .../main/java/minimized/TypeAnnotations.java | 59 +++++++++++++++++++ 3 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 tests/minimized/src/main/java/minimized/TypeAnnotations.java create mode 100644 tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TypeAnnotations.java 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..7c11068c 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() == com.sun.source.tree.Tree.Kind.ANNOTATED_TYPE) { + AnnotatedTypeTree annotatedTypeTree = (AnnotatedTypeTree) node.getIdentifier(); + if (annotatedTypeTree.getUnderlyingType().getKind() + == com.sun.source.tree.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..a06a3fb2 --- /dev/null +++ b/tests/minimized/src/main/java/minimized/TypeAnnotations.java @@ -0,0 +1,16 @@ +package minimized; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target({ ElementType.TYPE_USE }) +@interface TypeAnnotation { + int integer() default 1; +} + +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..667364be --- /dev/null +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TypeAnnotations.java @@ -0,0 +1,59 @@ +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 +} + +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#``(). + } +} From c26a1109727ba53d2a91e332a1a3a18ffc345de6 Mon Sep 17 00:00:00 2001 From: Anton Sviridov Date: Tue, 25 Feb 2025 11:38:21 +0000 Subject: [PATCH 2/5] better formatting --- .../com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 7c11068c..906fedc5 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 @@ -362,8 +362,7 @@ private void resolveNewClassTree(NewClassTree node, TreePath treePath) { // More complex case, where the type is annotated: `new @TypeParameters String()` else if (node.getIdentifier().getKind() == com.sun.source.tree.Tree.Kind.ANNOTATED_TYPE) { AnnotatedTypeTree annotatedTypeTree = (AnnotatedTypeTree) node.getIdentifier(); - if (annotatedTypeTree.getUnderlyingType().getKind() - == com.sun.source.tree.Tree.Kind.IDENTIFIER) { + if (annotatedTypeTree.getUnderlyingType().getKind() == com.sun.source.tree.Tree.Kind.IDENTIFIER) { IdentifierTree ident = (IdentifierTree) annotatedTypeTree.getUnderlyingType(); emitSymbolOccurrence( sym, ident, ident.getName(), Role.REFERENCE, CompilerRange.FROM_TEXT_SEARCH); From 53de7985e8f2ceedb326701192b29fd1e53fc6e6 Mon Sep 17 00:00:00 2001 From: Anton Sviridov Date: Tue, 25 Feb 2025 11:41:26 +0000 Subject: [PATCH 3/5] I guess javafmt thinks differently.. --- .../com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 906fedc5..7c11068c 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 @@ -362,7 +362,8 @@ private void resolveNewClassTree(NewClassTree node, TreePath treePath) { // More complex case, where the type is annotated: `new @TypeParameters String()` else if (node.getIdentifier().getKind() == com.sun.source.tree.Tree.Kind.ANNOTATED_TYPE) { AnnotatedTypeTree annotatedTypeTree = (AnnotatedTypeTree) node.getIdentifier(); - if (annotatedTypeTree.getUnderlyingType().getKind() == com.sun.source.tree.Tree.Kind.IDENTIFIER) { + if (annotatedTypeTree.getUnderlyingType().getKind() + == com.sun.source.tree.Tree.Kind.IDENTIFIER) { IdentifierTree ident = (IdentifierTree) annotatedTypeTree.getUnderlyingType(); emitSymbolOccurrence( sym, ident, ident.getName(), Role.REFERENCE, CompilerRange.FROM_TEXT_SEARCH); From 4810004ffa43e131165f59e7e505559fd1ebbf20 Mon Sep 17 00:00:00 2001 From: Anton Sviridov Date: Tue, 4 Mar 2025 15:21:10 +0000 Subject: [PATCH 4/5] PR comments --- .../com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java | 6 +++--- .../minimized/src/main/java/minimized/TypeAnnotations.java | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) 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 7c11068c..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 @@ -360,10 +360,10 @@ private void resolveNewClassTree(NewClassTree node, TreePath treePath) { CompilerRange.FROM_TEXT_SEARCH); } // More complex case, where the type is annotated: `new @TypeParameters String()` - else if (node.getIdentifier().getKind() == com.sun.source.tree.Tree.Kind.ANNOTATED_TYPE) { + else if (node.getIdentifier().getKind() == Tree.Kind.ANNOTATED_TYPE) { AnnotatedTypeTree annotatedTypeTree = (AnnotatedTypeTree) node.getIdentifier(); - if (annotatedTypeTree.getUnderlyingType().getKind() - == com.sun.source.tree.Tree.Kind.IDENTIFIER) { + 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 index a06a3fb2..9ddf6a8d 100644 --- a/tests/minimized/src/main/java/minimized/TypeAnnotations.java +++ b/tests/minimized/src/main/java/minimized/TypeAnnotations.java @@ -8,6 +8,7 @@ int integer() default 1; } +// FIXME(issue: GRAPH-1122): Definition range for T below is incorrect class ClassProcessed<@TypeAnnotation T extends Number> { public ClassProcessed() { From d807f4099abbef3a8c1e58559e42d9fb683115db Mon Sep 17 00:00:00 2001 From: Anton Sviridov Date: Tue, 4 Mar 2025 15:36:21 +0000 Subject: [PATCH 5/5] Fix --- .../tests/minimized/src/main/java/minimized/TypeAnnotations.java | 1 + 1 file changed, 1 insertion(+) 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 index 667364be..4bc4407e 100644 --- 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 @@ -28,6 +28,7 @@ // 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