From ff5891a46159a22c900220d697c2ba7f41a36f7e Mon Sep 17 00:00:00 2001 From: Arthur McGibbon Date: Mon, 8 Apr 2024 10:37:30 +0100 Subject: [PATCH] Cope with missing annotation parameter (#691) Co-authored-by: Arthur McGibbon --- .../semanticdb_javac/SemanticdbTrees.java | 8 +- .../AnnotationsOnParameterizedTypes.java | 42 ++++++ .../AnnotationsOnParameterizedTypes.java | 133 ++++++++++++++++++ 3 files changed, 180 insertions(+), 3 deletions(-) create mode 100644 tests/minimized/src/main/java/minimized/AnnotationsOnParameterizedTypes.java create mode 100644 tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnnotationsOnParameterizedTypes.java diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTrees.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTrees.java index e817fe12..93c0bd60 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTrees.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTrees.java @@ -84,9 +84,11 @@ public Semanticdb.AnnotationTree annotationBuilder(AnnotationTree annotation) { AssignmentTree assign = (AssignmentTree) param; ExpressionTree assignValue = assign.getExpression(); TreePath variableTreePath = nodes.get(assign.getVariable()); - Element variableSym = trees.getElement(variableTreePath); - String symbol = globals.semanticdbSymbol(variableSym, locals); - params.add(tree(assignTree(tree(idTree(symbol)), annotationParameter(assignValue)))); + if (variableTreePath != null) { + Element variableSym = trees.getElement(variableTreePath); + String symbol = globals.semanticdbSymbol(variableSym, locals); + params.add(tree(assignTree(tree(idTree(symbol)), annotationParameter(assignValue)))); + } } else { params.add(annotationParameter(param)); } diff --git a/tests/minimized/src/main/java/minimized/AnnotationsOnParameterizedTypes.java b/tests/minimized/src/main/java/minimized/AnnotationsOnParameterizedTypes.java new file mode 100644 index 00000000..604c62ce --- /dev/null +++ b/tests/minimized/src/main/java/minimized/AnnotationsOnParameterizedTypes.java @@ -0,0 +1,42 @@ +package minimized; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.function.Function; + +public interface AnnotationsOnParameterizedTypes { + + public static AnnotationsOnParameterizedTypes getInstance() { + return new AnnotationsOnParameterizedTypesImpl(); + } + + Function adapter(Class contract, Class wrappedClass); +} + + +class AnnotationsOnParameterizedTypesImpl implements AnnotationsOnParameterizedTypes { + private ConcurrentMap, Constructor> proxyConstructors = new ConcurrentHashMap<>(); + + @Override + public Function adapter(Class contract, Class wrappedClass) { + + Function constructor = getConstructor(contract); + + System.out.println(constructor); + + return null; + } + + private Function getConstructor(Class contract) { + @SuppressWarnings("unchecked") + Constructor constructor = (Constructor) proxyConstructors.computeIfAbsent(contract, c -> { + return null; + }); + + System.out.println(constructor); + + return null; + } +} \ No newline at end of file diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnnotationsOnParameterizedTypes.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnnotationsOnParameterizedTypes.java new file mode 100644 index 00000000..79922891 --- /dev/null +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnnotationsOnParameterizedTypes.java @@ -0,0 +1,133 @@ +package minimized; + +import java.lang.reflect.Constructor; +// ^^^^ reference semanticdb maven . . java/ +// ^^^^ reference semanticdb maven . . java/lang/ +// ^^^^^^^ reference semanticdb maven . . java/lang/reflect/ +// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/Constructor# +import java.lang.reflect.InvocationHandler; +// ^^^^ reference semanticdb maven . . java/ +// ^^^^ reference semanticdb maven . . java/lang/ +// ^^^^^^^ reference semanticdb maven . . java/lang/reflect/ +// ^^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/InvocationHandler# +import java.util.concurrent.ConcurrentHashMap; +// ^^^^ reference semanticdb maven . . java/ +// ^^^^ reference semanticdb maven . . java/util/ +// ^^^^^^^^^^ reference semanticdb maven . . java/util/concurrent/ +// ^^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/concurrent/ConcurrentHashMap# +import java.util.concurrent.ConcurrentMap; +// ^^^^ reference semanticdb maven . . java/ +// ^^^^ reference semanticdb maven . . java/util/ +// ^^^^^^^^^^ reference semanticdb maven . . java/util/concurrent/ +// ^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/concurrent/ConcurrentMap# +import java.util.function.Function; +// ^^^^ reference semanticdb maven . . java/ +// ^^^^ reference semanticdb maven . . java/util/ +// ^^^^^^^^ reference semanticdb maven . . java/util/function/ +// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/function/Function# + +public interface AnnotationsOnParameterizedTypes { +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypes# +// documentation ```java\npublic interface AnnotationsOnParameterizedTypes\n``` + + public static AnnotationsOnParameterizedTypes getInstance() { + return new AnnotationsOnParameterizedTypesImpl(); + } + + Function adapter(Class contract, Class wrappedClass); +} + + +class AnnotationsOnParameterizedTypesImpl implements AnnotationsOnParameterizedTypes { +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl# +// documentation ```java\nclass AnnotationsOnParameterizedTypesImpl\n``` +// relationship is_implementation semanticdb maven . . minimized/AnnotationsOnParameterizedTypes# +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#``(). +// documentation ```java\nAnnotationsOnParameterizedTypesImpl()\n``` +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypes# + private ConcurrentMap, Constructor> proxyConstructors = new ConcurrentHashMap<>(); +// ^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/concurrent/ConcurrentMap# +// ^^^^^ reference semanticdb maven jdk 11 java/lang/Class# +// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/Constructor# +// ^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#proxyConstructors. +// documentation ```java\nprivate ConcurrentMap, Constructor> proxyConstructors\n``` +// ^^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/concurrent/ConcurrentHashMap#``(). + + @Override +// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Override# + public Function adapter(Class contract, Class wrappedClass) { +// ^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] +// documentation ```java\nC\n``` +// ^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[W] +// documentation ```java\nW\n``` +// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/function/Function# +// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[W] +// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] +// ^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// documentation ```java\n@Override\npublic Function adapter(Class contract, Class wrappedClass)\n``` +// relationship is_reference is_implementation semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter(). +// ^^^^^ reference semanticdb maven jdk 11 java/lang/Class# +// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] +// ^^^^^^^^ definition local 0 +// documentation ```java\nClass contract\n``` +// ^^^^^ reference semanticdb maven jdk 11 java/lang/Class# +// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[W] +// ^^^^^^^^^^^^ definition local 1 +// documentation ```java\nClass wrappedClass\n``` + + Function constructor = getConstructor(contract); +// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/function/Function# +// ^^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/InvocationHandler# +// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] +// ^^^^^^^^^^^ definition local 2 +// documentation ```java\nFunction constructor\n``` +// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// ^^^^^^^^ reference local 0 + + System.out.println(constructor); +// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# +// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+9). +// ^^^^^^^^^^^ reference local 2 + + return null; + } + + private Function getConstructor(Class contract) { +// ^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] +// documentation ```java\nT\n``` +// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/function/Function# +// ^^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/InvocationHandler# +// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] +// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// documentation ```java\nprivate Function getConstructor(Class contract)\n``` +// ^^^^^ reference semanticdb maven jdk 11 java/lang/Class# +// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] +// ^^^^^^^^ definition local 3 +// documentation ```java\nClass contract\n``` + @SuppressWarnings("unchecked") +// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# + Constructor constructor = (Constructor) proxyConstructors.computeIfAbsent(contract, c -> { +// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/Constructor# +// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] +// ^^^^^^^^^^^ definition local 4 +// documentation ```java\n@SuppressWarnings("unchecked")\nConstructor constructor\n``` +// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/Constructor# +// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] +// ^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#proxyConstructors. +// ^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/concurrent/ConcurrentMap#computeIfAbsent(). +// ^^^^^^^^ reference local 3 +// ^ definition local 5 +// documentation ```java\nClass c\n``` + return null; + }); + + System.out.println(constructor); +// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# +// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+9). +// ^^^^^^^^^^^ reference local 4 + + return null; + } +} \ No newline at end of file