Question regarding type use annotation on method parameter type
Liam Miller-Cushon
cushon at google.com
Thu Feb 16 03:57:16 UTC 2023
Should `sAsType.getAnnotations()` be `sAsType.getAnnotationMirrors()`?
It works for me if B is being compiled from source as part of the same
compilation doing the annotation processing, but not if B is loaded from
the classpath, which is consistent with this known issue:
https://bugs.openjdk.org/browse/JDK-8225377
$ javac -processor P -implicit:none -sourcepath : -parameters A.java B.java
Note: B.c(java.lang. at A String).s has annotations [@A]
Note: B.c(java.lang. at A String).s has annotations [@A]
$ javac -processor P -implicit:none -sourcepath : -parameters A.java
Note: B.c(java.lang.String).s has annotations []
Note: B.c(java.lang.String).s has annotations []
=== A.java ===
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE})
public @interface A {}
=== B.java ===
public final class B {
public static final void c(@A String s) {}
}
=== P.java ===
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.tools.Diagnostic;
@SupportedAnnotationTypes("*")
public class P extends AbstractProcessor {
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latestSupported();
}
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
Elements elements = processingEnv.getElementUtils();
Element e = elements.getTypeElement("B");
ExecutableElement c = (ExecutableElement)
e.getEnclosedElements().get(1);
VariableElement s = c.getParameters().get(0);
TypeMirror sAsType = s.asType();
processingEnv
.getMessager()
.printMessage(
Diagnostic.Kind.NOTE,
String.format(
"%s.%s.%s has annotations [%s]", e, c, s,
sAsType.getAnnotationMirrors()));
return false;
}
}
On Wed, Feb 15, 2023 at 6:00 PM Laird Nelson <ljnelson at gmail.com> wrote:
> On Wed, Feb 15, 2023 at 5:07 PM Alex Buckley <alex.buckley at oracle.com>
> wrote:
>
>> Via ExecutableElement::getParameters, the VariableElement which
>> represents the declaration of formal parameter `s` should expose a
>> TypeMirror for the type `@A String`.
>>
>
> Thank you. That is exactly what I expected. It does not. Should I file a
> bug?
>
> Test code excerpted below:
>
> Element e = elements.getTypeElement("B");
> ExecutableElement c = (ExecutableElement)e.getEnclosedElements().get(1);
> // 0 is the implicit constructor; 1 is the c method
> assert "c".equals(c.getSimpleName().toString()); // yep, got the right
> method
> VariableElement s = (VariableElement)c.getParameters().get(0);
> assert "s".equals(s.getSimpleName().toString()); // yep, got the right
> parameter
> DeclaredType sAsType = (DeclaredType)s.asType();
> assert !sAsType.getAnnotations().isEmpty(); // fails; it is empty
>
> Thanks,
> Laird
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/compiler-dev/attachments/20230215/2375ceb8/attachment-0001.htm>
More information about the compiler-dev
mailing list