Search in sources :

Example 96 with Types

use of javax.lang.model.util.Types in project qpid-broker-j by apache.

the class ManagedAnnotationValidator method process.

@Override
public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {
    Elements elementUtils = processingEnv.getElementUtils();
    Types typeUtils = processingEnv.getTypeUtils();
    TypeElement annotationElement = elementUtils.getTypeElement(MANAGED_ANNOTATION_CLASS_NAME);
    String className = "org.apache.qpid.server.model.ManagedInterface";
    TypeMirror configuredObjectType = getErasure(className);
    for (Element e : roundEnv.getElementsAnnotatedWith(annotationElement)) {
        if (e.getKind() != ElementKind.INTERFACE) {
            processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@" + annotationElement.getSimpleName() + " can only be applied to an interface", e);
        }
        if (!typeUtils.isAssignable(typeUtils.erasure(e.asType()), configuredObjectType)) {
            processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@" + annotationElement.getSimpleName() + " can only be applied to an interface which extends " + className, e);
        }
    }
    return false;
}
Also used : Types(javax.lang.model.util.Types) SupportedAnnotationTypes(javax.annotation.processing.SupportedAnnotationTypes) TypeMirror(javax.lang.model.type.TypeMirror) TypeElement(javax.lang.model.element.TypeElement) Element(javax.lang.model.element.Element) TypeElement(javax.lang.model.element.TypeElement) Elements(javax.lang.model.util.Elements)

Example 97 with Types

use of javax.lang.model.util.Types in project qpid-broker-j by apache.

the class CompositeTypeConstructorGenerator method generateAssigners.

private void generateAssigners(final PrintWriter pw, final TypeElement typeElement) {
    Types typeUtils = processingEnv.getTypeUtils();
    final List<AnnotatedField> annotatedFields = new ArrayList<>();
    for (Element element : typeElement.getEnclosedElements()) {
        if (element instanceof VariableElement && element.getKind() == ElementKind.FIELD) {
            boolean annotationFound = false;
            for (AnnotationMirror annotationMirror : element.getAnnotationMirrors()) {
                if (annotationMirror.getAnnotationType().toString().equals("org.apache.qpid.server.protocol.v1_0.CompositeTypeField")) {
                    if (annotationFound) {
                        processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, String.format("More than one CompositeTypeField annotations on field '%s.%s'", typeElement.getSimpleName(), element.getSimpleName()));
                    }
                    annotationFound = true;
                    annotatedFields.add(new AnnotatedField((VariableElement) element, annotationMirror));
                }
            }
        }
    }
    annotatedFields.sort(Comparator.comparingInt(AnnotatedField::getIndex));
    for (int index = 0; index < annotatedFields.size(); ++index) {
        AnnotatedField annotatedField = annotatedFields.get(index);
        final VariableElement variableElement = annotatedField.getVariableElement();
        final String fieldName = stripUnderscore(variableElement.getSimpleName().toString());
        if (annotatedField.getIndex() != index) {
            processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, String.format("Unexpected CompositeTypeField index '%d' is specified on field '%s' of '%s'. Expected %d.", annotatedField.getIndex(), fieldName, typeElement.getSimpleName(), index));
        }
        final String baseIndent = "        ";
        if (variableElement.asType().getKind() == TypeKind.ARRAY) {
            final TypeMirror componentType = ((ArrayType) variableElement.asType()).getComponentType();
            final String functionString;
            if (annotatedField.getFactory() != null) {
                functionString = "x -> " + annotatedField.getFactory() + "(x)";
            } else if (RESTRICTED_TYPES.contains(componentType)) {
                functionString = variableElement.asType().toString() + "::valueOf";
            } else {
                functionString = "x -> (" + componentType + ") x";
            }
            pw.println(String.format("        %s %s = fieldValueReader.readArrayValue(%d, \"%s\", %s, %s.class, %s);", annotatedField.getVariableElement().asType(), fieldName, index, fieldName, annotatedField.isMandatory(), componentType, functionString));
            optionallyWrapInNullCheck(!annotatedField.isMandatory(), pw, baseIndent, fieldName, indent -> {
                pw.println(indent + "obj." + getSetterName(variableElement) + "(" + fieldName + ");");
            });
        } else if (annotatedField.getFactory() != null || RESTRICTED_TYPES.contains(variableElement.asType().toString())) {
            String functionName = annotatedField.getFactory() != null ? annotatedField.getFactory() : variableElement.asType().toString() + ".valueOf";
            pw.println(String.format("        Object %s = fieldValueReader.readValue(%d, \"%s\", %s, Object.class);", fieldName, index, fieldName, annotatedField.isMandatory()));
            optionallyWrapInNullCheck(!annotatedField.isMandatory(), pw, baseIndent, fieldName, indent -> {
                pw.println(indent + "try");
                pw.println(indent + "{");
                pw.println(indent + "    obj." + getSetterName(variableElement) + "(" + functionName + "(" + fieldName + "));");
                pw.println(indent + "}");
                pw.println(indent + "catch (RuntimeException e)");
                pw.println(indent + "{");
                pw.println(indent + "    Error error = new Error(AmqpError.DECODE_ERROR, \"Could not decode value field '" + fieldName + "' of '" + typeElement.getSimpleName() + "'\");");
                pw.println(indent + "    throw new AmqpErrorException(error, e);");
                pw.println(indent + "}");
            });
        } else if (typeUtils.isSameType(typeUtils.erasure(variableElement.asType()), getErasure(processingEnv, "java.util.Map"))) {
            List<? extends TypeMirror> args = ((DeclaredType) variableElement.asType()).getTypeArguments();
            if (args.size() != 2) {
                processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Map types must have exactly two type arguments");
            }
            pw.println(String.format("        %s %s = fieldValueReader.readMapValue(%d, \"%s\", %s, %s.class, %s.class);", annotatedField.getVariableElement().asType(), fieldName, index, fieldName, annotatedField.isMandatory(), args.get(0), args.get(1)));
            optionallyWrapInNullCheck(!annotatedField.isMandatory(), pw, baseIndent, fieldName, indent -> {
                pw.println(indent + "obj." + getSetterName(variableElement) + "(" + fieldName + ");");
            });
        } else {
            pw.println(String.format("        %s %s = fieldValueReader.readValue(%d, \"%s\", %s, %s.class);", annotatedField.getVariableElement().asType(), fieldName, index, fieldName, annotatedField.isMandatory(), annotatedField.getVariableElement().asType()));
            optionallyWrapInNullCheck(!annotatedField.isMandatory(), pw, baseIndent, fieldName, indent -> {
                pw.println(indent + "obj." + getSetterName(variableElement) + "(" + fieldName + ");");
            });
        }
        pw.println();
    }
}
Also used : Arrays(java.util.Arrays) PackageElement(javax.lang.model.element.PackageElement) AbstractProcessor(javax.annotation.processing.AbstractProcessor) VariableElement(javax.lang.model.element.VariableElement) TypeElement(javax.lang.model.element.TypeElement) Elements(javax.lang.model.util.Elements) ArrayList(java.util.ArrayList) Diagnostic(javax.tools.Diagnostic) Map(java.util.Map) DeclaredType(javax.lang.model.type.DeclaredType) OutputStreamWriter(java.io.OutputStreamWriter) PrintWriter(java.io.PrintWriter) ArrayType(javax.lang.model.type.ArrayType) ElementKind(javax.lang.model.element.ElementKind) StringWriter(java.io.StringWriter) ExecutableElement(javax.lang.model.element.ExecutableElement) Set(java.util.Set) IOException(java.io.IOException) Element(javax.lang.model.element.Element) Types(javax.lang.model.util.Types) AnnotationMirror(javax.lang.model.element.AnnotationMirror) TypeKind(javax.lang.model.type.TypeKind) Consumer(java.util.function.Consumer) JavaFileObject(javax.tools.JavaFileObject) SourceVersion(javax.lang.model.SourceVersion) License(org.apache.qpid.server.License) List(java.util.List) TypeMirror(javax.lang.model.type.TypeMirror) RoundEnvironment(javax.annotation.processing.RoundEnvironment) Filer(javax.annotation.processing.Filer) ProcessingEnvironment(javax.annotation.processing.ProcessingEnvironment) AnnotationValue(javax.lang.model.element.AnnotationValue) Comparator(java.util.Comparator) Collections(java.util.Collections) Types(javax.lang.model.util.Types) PackageElement(javax.lang.model.element.PackageElement) VariableElement(javax.lang.model.element.VariableElement) TypeElement(javax.lang.model.element.TypeElement) ExecutableElement(javax.lang.model.element.ExecutableElement) Element(javax.lang.model.element.Element) ArrayList(java.util.ArrayList) VariableElement(javax.lang.model.element.VariableElement) ArrayType(javax.lang.model.type.ArrayType) AnnotationMirror(javax.lang.model.element.AnnotationMirror) TypeMirror(javax.lang.model.type.TypeMirror) DeclaredType(javax.lang.model.type.DeclaredType)

Example 98 with Types

use of javax.lang.model.util.Types in project qpid-broker-j by apache.

the class ContentHeaderAnnotationValidator method checkClassExtendsContent.

private void checkClassExtendsContent(TypeElement annotationElement, Element e) {
    Types typeUtils = processingEnv.getTypeUtils();
    TypeMirror contentType = getErasure(CONTENT_CLASS_NAME);
    TypeElement parent = (TypeElement) e.getEnclosingElement();
    if (!typeUtils.isAssignable(typeUtils.erasure(parent.asType()), contentType)) {
        processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@" + annotationElement.getSimpleName() + " can only be applied to methods within a class implementing " + contentType.toString() + " which does not apply to " + parent.asType().toString(), e);
    }
}
Also used : Types(javax.lang.model.util.Types) SupportedAnnotationTypes(javax.annotation.processing.SupportedAnnotationTypes) TypeMirror(javax.lang.model.type.TypeMirror) TypeElement(javax.lang.model.element.TypeElement)

Example 99 with Types

use of javax.lang.model.util.Types in project qpid-broker-j by apache.

the class ContentHeaderAnnotationValidator method isValidType.

private boolean isValidType(TypeMirror type) {
    Types typeUtils = processingEnv.getTypeUtils();
    Elements elementUtils = processingEnv.getElementUtils();
    Element typeElement = typeUtils.asElement(type);
    if (VALID_PRIMITIVE_TYPES.contains(type.getKind())) {
        return true;
    }
    for (TypeKind primitive : VALID_PRIMITIVE_TYPES) {
        if (typeUtils.isSameType(type, typeUtils.boxedClass(typeUtils.getPrimitiveType(primitive)).asType())) {
            return true;
        }
    }
    if (typeElement != null && typeElement.getKind() == ElementKind.ENUM) {
        return true;
    }
    if (typeUtils.isSameType(type, elementUtils.getTypeElement("java.lang.String").asType())) {
        return true;
    }
    return false;
}
Also used : Types(javax.lang.model.util.Types) SupportedAnnotationTypes(javax.annotation.processing.SupportedAnnotationTypes) ExecutableElement(javax.lang.model.element.ExecutableElement) Element(javax.lang.model.element.Element) TypeElement(javax.lang.model.element.TypeElement) TypeKind(javax.lang.model.type.TypeKind) Elements(javax.lang.model.util.Elements)

Example 100 with Types

use of javax.lang.model.util.Types in project ucsFramework by cjsoftware-lib.

the class PreserveUiStateProcessor method isDescendantOfOneOf.

boolean isDescendantOfOneOf(TypeMirror fieldType, List<? extends TypeMirror> typeList) {
    boolean foundMatchingInstance = false;
    Types typeUtils = getProcessorModel().getTypeUtils();
    for (TypeMirror typeMirror : typeList) {
        if (typeUtils.isSubtype(fieldType, typeMirror)) {
            foundMatchingInstance = true;
            break;
        }
    }
    return foundMatchingInstance;
}
Also used : Types(javax.lang.model.util.Types) TypeMirror(javax.lang.model.type.TypeMirror)

Aggregations

Types (javax.lang.model.util.Types)113 TypeMirror (javax.lang.model.type.TypeMirror)77 TypeElement (javax.lang.model.element.TypeElement)52 Elements (javax.lang.model.util.Elements)48 ExecutableElement (javax.lang.model.element.ExecutableElement)34 Element (javax.lang.model.element.Element)30 SupportedAnnotationTypes (javax.annotation.processing.SupportedAnnotationTypes)27 DeclaredType (javax.lang.model.type.DeclaredType)26 ArrayList (java.util.ArrayList)25 Map (java.util.Map)24 VariableElement (javax.lang.model.element.VariableElement)24 List (java.util.List)21 AnnotationMirror (javax.lang.model.element.AnnotationMirror)20 TypeKind (javax.lang.model.type.TypeKind)18 Set (java.util.Set)16 Collection (java.util.Collection)15 HashMap (java.util.HashMap)13 ElementKind (javax.lang.model.element.ElementKind)13 Modifier (javax.lang.model.element.Modifier)13 IOException (java.io.IOException)12