Skip to content

Commit 95af400

Browse files
Fix annotated types in new class expression (#773)
1 parent c681b3d commit 95af400

File tree

3 files changed

+97
-6
lines changed

3 files changed

+97
-6
lines changed

semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java

+20-6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.sun.source.tree.TypeCastTree;
1919
import com.sun.source.tree.TypeParameterTree;
2020
import com.sun.source.tree.ParameterizedTypeTree;
21+
import com.sun.source.tree.AnnotatedTypeTree;
2122

2223
import javax.tools.Diagnostic;
2324
import javax.lang.model.element.Element;
@@ -349,12 +350,25 @@ private void resolveNewClassTree(NewClassTree node, TreePath treePath) {
349350
if (parentSym == null || parentSym.getKind() != ElementKind.ENUM_CONSTANT) {
350351
TreePath identifierTreePath = nodes.get(node.getIdentifier());
351352
Element identifierSym = trees.getElement(identifierTreePath);
352-
emitSymbolOccurrence(
353-
sym,
354-
node,
355-
identifierSym.getSimpleName(),
356-
Role.REFERENCE,
357-
CompilerRange.FROM_TEXT_SEARCH);
353+
// Simplest case, e.g. `new String()`
354+
if (identifierSym != null) {
355+
emitSymbolOccurrence(
356+
sym,
357+
node,
358+
identifierSym.getSimpleName(),
359+
Role.REFERENCE,
360+
CompilerRange.FROM_TEXT_SEARCH);
361+
}
362+
// More complex case, where the type is annotated: `new @TypeParameters String()`
363+
else if (node.getIdentifier().getKind() == Tree.Kind.ANNOTATED_TYPE) {
364+
AnnotatedTypeTree annotatedTypeTree = (AnnotatedTypeTree) node.getIdentifier();
365+
if (annotatedTypeTree.getUnderlyingType() != null
366+
&& annotatedTypeTree.getUnderlyingType().getKind() == Tree.Kind.IDENTIFIER) {
367+
IdentifierTree ident = (IdentifierTree) annotatedTypeTree.getUnderlyingType();
368+
emitSymbolOccurrence(
369+
sym, ident, ident.getName(), Role.REFERENCE, CompilerRange.FROM_TEXT_SEARCH);
370+
}
371+
}
358372
}
359373
}
360374
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package minimized;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Target;
5+
6+
@Target({ ElementType.TYPE_USE })
7+
@interface TypeAnnotation {
8+
int integer() default 1;
9+
}
10+
11+
// FIXME(issue: GRAPH-1122): Definition range for T below is incorrect
12+
class ClassProcessed<@TypeAnnotation T extends Number> {
13+
14+
public ClassProcessed() {
15+
String s = new @TypeAnnotation String();
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package minimized;
2+
3+
import java.lang.annotation.ElementType;
4+
// ^^^^ reference semanticdb maven . . java/
5+
// ^^^^ reference semanticdb maven . . java/lang/
6+
// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/
7+
// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#
8+
import java.lang.annotation.Target;
9+
// ^^^^ reference semanticdb maven . . java/
10+
// ^^^^ reference semanticdb maven . . java/lang/
11+
// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/
12+
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Target#
13+
14+
@Target({ ElementType.TYPE_USE })
15+
//^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Target#
16+
// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#
17+
// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#TYPE_USE.
18+
@interface TypeAnnotation {
19+
// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/TypeAnnotation#
20+
// display_name TypeAnnotation
21+
// signature_documentation java @Target({ElementType.TYPE_USE})\n@interface TypeAnnotation
22+
// kind Interface
23+
// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation#
24+
int integer() default 1;
25+
// ^^^^^^^ definition semanticdb maven . . minimized/TypeAnnotation#integer().
26+
// display_name integer
27+
// signature_documentation java public abstract int integer()
28+
// kind AbstractMethod
29+
}
30+
31+
// FIXME(issue: GRAPH-1122): Definition range for T below is incorrect
32+
class ClassProcessed<@TypeAnnotation T extends Number> {
33+
// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ClassProcessed#
34+
// display_name ClassProcessed
35+
// signature_documentation java class ClassProcessed<T extends Number>
36+
// kind Class
37+
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ClassProcessed#[T]
38+
// display_name T
39+
// signature_documentation java T extends Number
40+
// kind TypeParameter
41+
// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/TypeAnnotation#
42+
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/Number#
43+
44+
public ClassProcessed() {
45+
// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ClassProcessed#`<init>`().
46+
// display_name <init>
47+
// signature_documentation java public ClassProcessed()
48+
// kind Constructor
49+
String s = new @TypeAnnotation String();
50+
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String#
51+
// ^ definition local 0
52+
// display_name s
53+
// signature_documentation java String s
54+
// enclosing_symbol semanticdb maven . . minimized/ClassProcessed#`<init>`().
55+
// kind Variable
56+
// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/TypeAnnotation#
57+
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String#
58+
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String#`<init>`().
59+
}
60+
}

0 commit comments

Comments
 (0)