Skip to content

Fix annotated types in new class expression #773

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
}
}
}
Expand Down
17 changes: 17 additions & 0 deletions tests/minimized/src/main/java/minimized/TypeAnnotations.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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<T extends Number>
// kind Class
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ClassProcessed#[T]
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that this bug is caused by a separate issue, and I will fix it separately.

// 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#`<init>`().
// display_name <init>
Copy link
Contributor Author

@antonsviridov-src antonsviridov-src Feb 25, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another bug just spotted 🙃

nope, that's correct

// 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#`<init>`().
// kind Variable
// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/TypeAnnotation#
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String#
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String#`<init>`().
}
}