use of javax.lang.model.element.AnnotationMirror in project st-js by st-js.
the class ClassWriter method isBridge.
private boolean isBridge(ClassTree tree) {
TypeElement type = TreeUtils.elementFromDeclaration(tree);
List<? extends AnnotationMirror> annotations = type.getAnnotationMirrors();
for (AnnotationMirror a : annotations) {
if (a.getAnnotationType().toString().equals(STJSBridge.class.getName())) {
return true;
}
}
return false;
}
use of javax.lang.model.element.AnnotationMirror in project graal by oracle.
the class OptionProcessor method process.
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (roundEnv.processingOver()) {
return true;
}
ProcessorContext context = new ProcessorContext(processingEnv, null);
ProcessorContext.setThreadLocalInstance(context);
try {
Map<Element, OptionsInfo> map = new HashMap<>();
for (Element element : roundEnv.getElementsAnnotatedWith(Option.class)) {
if (!processed.contains(element)) {
processed.add(element);
Element topElement = element.getEnclosingElement();
OptionsInfo options = map.get(topElement);
if (options == null) {
options = new OptionsInfo(topElement);
map.put(topElement, options);
}
AnnotationMirror mirror = ElementUtils.findAnnotationMirror(processingEnv, element.getAnnotationMirrors(), Option.class);
try {
processElement(element, mirror, options);
} catch (Throwable t) {
handleThrowable(t, topElement);
}
}
}
Map<String, OptionInfo> seenKeys = new HashMap<>();
for (OptionsInfo infos : map.values()) {
for (OptionInfo info : infos.options) {
if (seenKeys.containsKey(info.name)) {
OptionInfo otherInfo = seenKeys.get(info.name);
String message = "Two options with duplicated resolved descriptor name '%s' found.";
info.valid = false;
otherInfo.valid = false;
error(info.field, info.annotation, message, info.name);
error(otherInfo.field, otherInfo.annotation, message, otherInfo.name);
} else {
seenKeys.put(info.name, info);
}
}
}
for (OptionsInfo infos : map.values()) {
ListIterator<OptionInfo> listIterator = infos.options.listIterator();
while (listIterator.hasNext()) {
OptionInfo info = listIterator.next();
if (info.valid) {
ExpectError.assertNoErrorExpected(processingEnv, info.field);
} else {
listIterator.remove();
}
}
Collections.sort(infos.options, new Comparator<OptionInfo>() {
public int compare(OptionInfo o1, OptionInfo o2) {
return o1.name.compareTo(o2.name);
}
});
}
for (OptionsInfo info : map.values()) {
try {
generateOptionDescriptor(info);
} catch (Throwable t) {
handleThrowable(t, info.type);
}
}
} finally {
ProcessorContext.setThreadLocalInstance(null);
}
return true;
}
use of javax.lang.model.element.AnnotationMirror in project graal by oracle.
the class ElementUtils method collectAnnotations.
public static List<AnnotationMirror> collectAnnotations(ProcessorContext context, AnnotationMirror markerAnnotation, String elementName, Element element, Class<? extends Annotation> annotationClass) {
List<AnnotationMirror> result = new ArrayList<>();
if (markerAnnotation != null) {
result.addAll(ElementUtils.getAnnotationValueList(AnnotationMirror.class, markerAnnotation, elementName));
}
AnnotationMirror explicit = ElementUtils.findAnnotationMirror(context.getEnvironment(), element, annotationClass);
if (explicit != null) {
result.add(explicit);
}
return result;
}
use of javax.lang.model.element.AnnotationMirror in project graal by oracle.
the class InstrumentableProcessor method processLegacyInstrumentable.
/*
* TO BE REMOVED WITH DEPRECATIONS
*/
@SuppressWarnings("deprecation")
private void processLegacyInstrumentable(RoundEnvironment roundEnv, ProcessorContext context) {
for (Element element : roundEnv.getElementsAnnotatedWith(com.oracle.truffle.api.instrumentation.Instrumentable.class)) {
if (!element.getKind().isClass() && !element.getKind().isInterface()) {
continue;
}
try {
if (element.getKind() != ElementKind.CLASS) {
emitError(element, String.format("Only classes can be annotated with %s.", com.oracle.truffle.api.instrumentation.Instrumentable.class.getSimpleName()));
continue;
}
AnnotationMirror generateWrapperMirror = ElementUtils.findAnnotationMirror(element.getAnnotationMirrors(), context.getType(GenerateWrapper.class));
if (generateWrapperMirror != null) {
continue;
}
TypeMirror instrumentableType = context.getType(com.oracle.truffle.api.instrumentation.Instrumentable.class);
AnnotationMirror instrumentable = ElementUtils.findAnnotationMirror(element.getAnnotationMirrors(), instrumentableType);
if (instrumentable == null) {
continue;
} else {
final boolean generateWrapper;
TypeMirror factoryType = ElementUtils.getAnnotationValue(TypeMirror.class, instrumentable, "factory");
if (factoryType == null || factoryType.getKind() == TypeKind.ERROR) {
// factory type is erroneous or null (can mean error in javac)
// generate it
generateWrapper = true;
} else {
TypeElement type = context.getEnvironment().getElementUtils().getTypeElement("com.oracle.truffle.api.instrumentation.test.TestErrorFactory");
if (type != null && ElementUtils.typeEquals(factoryType, type.asType())) {
generateWrapper = true;
} else {
// factory is user defined or already generated
generateWrapper = false;
}
}
if (!generateWrapper) {
continue;
}
}
CodeTypeElement unit = generateWrapperAndFactory(context, element);
if (unit == null) {
continue;
}
DeclaredType overrideType = (DeclaredType) context.getType(Override.class);
DeclaredType unusedType = (DeclaredType) context.getType(SuppressWarnings.class);
unit.accept(new GenerateOverrideVisitor(overrideType), null);
unit.accept(new FixWarningsVisitor(context.getEnvironment(), unusedType, overrideType), null);
unit.accept(new CodeWriter(context.getEnvironment(), element), null);
} catch (Throwable e) {
// never throw annotation processor exceptions to the compiler
// it might screw up its state.
handleThrowable(e, element);
}
}
}
use of javax.lang.model.element.AnnotationMirror in project graal by oracle.
the class InstrumentableProcessor method process.
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (roundEnv.processingOver()) {
return false;
}
try {
ProcessorContext context = new ProcessorContext(processingEnv, null);
ProcessorContext.setThreadLocalInstance(context);
DeclaredType instrumentableNode = context.getDeclaredType(InstrumentableNode.class);
ExecutableElement createWrapper = ElementUtils.findExecutableElement(instrumentableNode, CREATE_WRAPPER_NAME);
for (Element element : roundEnv.getElementsAnnotatedWith(GenerateWrapper.class)) {
if (!element.getKind().isClass() && !element.getKind().isInterface()) {
continue;
}
try {
if (element.getKind() != ElementKind.CLASS) {
emitError(element, String.format("Only classes can be annotated with %s.", GenerateWrapper.class.getSimpleName()));
continue;
}
if (createWrapper == null) {
emitError(element, String.format("Fatal %s.%s not found.", InstrumentableNode.class.getSimpleName(), CREATE_WRAPPER_NAME));
continue;
}
if (!ElementUtils.isAssignable(element.asType(), instrumentableNode)) {
emitError(element, String.format("Classes annotated with @%s must implement %s.", GenerateWrapper.class.getSimpleName(), InstrumentableNode.class.getSimpleName()));
continue;
} else {
boolean createWrapperFound = false;
for (ExecutableElement declaredMethod : ElementFilter.methodsIn(element.getEnclosedElements())) {
if (ElementUtils.signatureEquals(declaredMethod, createWrapper)) {
createWrapperFound = true;
break;
}
}
if (!createWrapperFound) {
emitError(element, String.format("Classes annotated with @%s must declare/override %s.%s and return a new instance of the generated wrapper class called %s." + " You may copy the following generated implementation: %n" + " @Override public %s createWrapper(%s probeNode) {%n" + " return new %s(this, probeNode);%n" + " }", GenerateWrapper.class.getSimpleName(), InstrumentableNode.class.getSimpleName(), CREATE_WRAPPER_NAME, createWrapperClassName((TypeElement) element), com.oracle.truffle.api.instrumentation.InstrumentableNode.WrapperNode.class.getSimpleName(), ProbeNode.class.getSimpleName(), createWrapperClassName((TypeElement) element)));
continue;
}
if (!ElementUtils.isAssignable(element.asType(), context.getType(Node.class))) {
emitError(element, String.format("Classes annotated with @%s must extend %s.", GenerateWrapper.class.getSimpleName(), Node.class.getSimpleName()));
continue;
}
}
AnnotationMirror generateWrapperMirror = ElementUtils.findAnnotationMirror(element.getAnnotationMirrors(), context.getType(GenerateWrapper.class));
if (generateWrapperMirror == null) {
continue;
}
CodeTypeElement unit = generateWrapperOnly(context, element);
if (unit == null) {
continue;
}
DeclaredType overrideType = (DeclaredType) context.getType(Override.class);
DeclaredType unusedType = (DeclaredType) context.getType(SuppressWarnings.class);
unit.accept(new GenerateOverrideVisitor(overrideType), null);
unit.accept(new FixWarningsVisitor(context.getEnvironment(), unusedType, overrideType), null);
unit.accept(new CodeWriter(context.getEnvironment(), element), null);
} catch (Throwable e) {
// never throw annotation processor exceptions to the compiler
// it might screw up its state.
handleThrowable(e, element);
}
}
// remove with deprecations
processLegacyInstrumentable(roundEnv, context);
return true;
} finally {
ProcessorContext.setThreadLocalInstance(null);
}
}
Aggregations