-
Bug
-
Resolution: Unresolved
-
P3
-
None
-
12
-
x86_64
-
windows_10
ADDITIONAL SYSTEM INFORMATION :
I doubt it matters but the annotation processors are still marked @SupportedSourceVersion(SourceVersion.RELEASE_8) and I'm running this on Gradle 5.3.1.
A DESCRIPTION OF THE PROBLEM :
I'm running an annotation processor that I've wrote. It ran fine on JDK 8 and now I'm experiencing a problem on JDK 12, I have not tested JDK 9, 10, or 11.
I have a TypeElement and I want to retrieve its binary name to pass to Class.forName. I use javax.lang.model.util.Elements.getBinaryName(TypeElement) and it returns a garbage value <any?>$OuterClass.InnerClass instead of the expected example3.OuterClass$InnerClass.
I attempted to replace getBinaryName with TypeElement.getQualifiedName (even though it wouldn't quite work for an inner class) but it gives me the same garbage result.
REGRESSION : Last worked in version 8u201
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
The TypeElement was obtained by catching a MirroredTypeException like so:
try {
exampleAnnotation.value();
throw new IllegalStateException("Expected a MirroredTypeException.");
} catch (MirroredTypeException ex) {
return (TypeElement) types.asElement(ex.getTypeMirror());
}
And here's the definition of ExampleAnnotation:
package example1;
@Target(PACKAGE)
@Retention(RUNTIME)
@Documented
public @interface ExampleAnnotation {
Class<? extends Derived> value() default Derived.class;
interface Derived<A extends Annotation> extends Base<A> {
String foo();
}
}
And here's the instance of the annotation that the processor is accessing in package-info.java:
@ExampleAnnotation(OuterClass.InnerClass.class)
package example2;
import example1.ExampleAnnotation;
I've also tried the fully qualified name example3.OuterClass.InnerClass.class but that also results in garbage: <any?>$example3.OuterClass.InnerClass.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
javax.lang.model.util.Elements.getBinaryName should return example3.OuterClass$InnerClass
and TypeElement.getQualifiedName should return example3.OuterClass.InnerClass
ACTUAL -
javax.lang.model.util.Elements.getBinaryName and TypeElement.getQualifiedName are erroneously returning <any?>$OuterClass.InnerClass or <any?>$example3.OuterClass.InnerClass depending on if I use the imported name vs fully qualified name, respectively.
FREQUENCY : always
I doubt it matters but the annotation processors are still marked @SupportedSourceVersion(SourceVersion.RELEASE_8) and I'm running this on Gradle 5.3.1.
A DESCRIPTION OF THE PROBLEM :
I'm running an annotation processor that I've wrote. It ran fine on JDK 8 and now I'm experiencing a problem on JDK 12, I have not tested JDK 9, 10, or 11.
I have a TypeElement and I want to retrieve its binary name to pass to Class.forName. I use javax.lang.model.util.Elements.getBinaryName(TypeElement) and it returns a garbage value <any?>$OuterClass.InnerClass instead of the expected example3.OuterClass$InnerClass.
I attempted to replace getBinaryName with TypeElement.getQualifiedName (even though it wouldn't quite work for an inner class) but it gives me the same garbage result.
REGRESSION : Last worked in version 8u201
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
The TypeElement was obtained by catching a MirroredTypeException like so:
try {
exampleAnnotation.value();
throw new IllegalStateException("Expected a MirroredTypeException.");
} catch (MirroredTypeException ex) {
return (TypeElement) types.asElement(ex.getTypeMirror());
}
And here's the definition of ExampleAnnotation:
package example1;
@Target(PACKAGE)
@Retention(RUNTIME)
@Documented
public @interface ExampleAnnotation {
Class<? extends Derived> value() default Derived.class;
interface Derived<A extends Annotation> extends Base<A> {
String foo();
}
}
And here's the instance of the annotation that the processor is accessing in package-info.java:
@ExampleAnnotation(OuterClass.InnerClass.class)
package example2;
import example1.ExampleAnnotation;
I've also tried the fully qualified name example3.OuterClass.InnerClass.class but that also results in garbage: <any?>$example3.OuterClass.InnerClass.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
javax.lang.model.util.Elements.getBinaryName should return example3.OuterClass$InnerClass
and TypeElement.getQualifiedName should return example3.OuterClass.InnerClass
ACTUAL -
javax.lang.model.util.Elements.getBinaryName and TypeElement.getQualifiedName are erroneously returning <any?>$OuterClass.InnerClass or <any?>$example3.OuterClass.InnerClass depending on if I use the imported name vs fully qualified name, respectively.
FREQUENCY : always
- relates to
-
JDK-8229535 AnnotationValues for unresolvable class literals are represented as the string "<error>" instead of an ErrorType
- Open