Search in sources :

Example 91 with Types

use of javax.lang.model.util.Types in project auto by google.

the class MoreTypesTest method testAsMemberOf_variableElement.

@Test
public void testAsMemberOf_variableElement() {
    Types types = compilationRule.getTypes();
    Elements elements = compilationRule.getElements();
    TypeMirror numberType = elements.getTypeElement(Number.class.getCanonicalName()).asType();
    TypeMirror stringType = elements.getTypeElement(String.class.getCanonicalName()).asType();
    TypeMirror integerType = elements.getTypeElement(Integer.class.getCanonicalName()).asType();
    TypeElement paramsElement = elements.getTypeElement(Params.class.getCanonicalName());
    VariableElement tParam = Iterables.getOnlyElement(Iterables.getOnlyElement(ElementFilter.methodsIn(paramsElement.getEnclosedElements())).getParameters());
    VariableElement tField = Iterables.getOnlyElement(ElementFilter.fieldsIn(paramsElement.getEnclosedElements()));
    DeclaredType numberParams = (DeclaredType) elements.getTypeElement(NumberParams.class.getCanonicalName()).asType();
    DeclaredType stringParams = (DeclaredType) elements.getTypeElement(StringParams.class.getCanonicalName()).asType();
    TypeElement genericParams = elements.getTypeElement(GenericParams.class.getCanonicalName());
    DeclaredType genericParamsOfNumber = types.getDeclaredType(genericParams, numberType);
    DeclaredType genericParamsOfInteger = types.getDeclaredType(genericParams, integerType);
    TypeMirror fieldOfNumberParams = MoreTypes.asMemberOf(types, numberParams, tField);
    TypeMirror paramOfNumberParams = MoreTypes.asMemberOf(types, numberParams, tParam);
    TypeMirror fieldOfStringParams = MoreTypes.asMemberOf(types, stringParams, tField);
    TypeMirror paramOfStringParams = MoreTypes.asMemberOf(types, stringParams, tParam);
    TypeMirror fieldOfGenericOfNumber = MoreTypes.asMemberOf(types, genericParamsOfNumber, tField);
    TypeMirror paramOfGenericOfNumber = MoreTypes.asMemberOf(types, genericParamsOfNumber, tParam);
    TypeMirror fieldOfGenericOfInteger = MoreTypes.asMemberOf(types, genericParamsOfInteger, tField);
    TypeMirror paramOfGenericOfInteger = MoreTypes.asMemberOf(types, genericParamsOfInteger, tParam);
    EquivalenceTester<TypeMirror> tester = EquivalenceTester.<TypeMirror>of(MoreTypes.equivalence()).addEquivalenceGroup(fieldOfNumberParams, paramOfNumberParams, fieldOfGenericOfNumber, paramOfGenericOfNumber, numberType).addEquivalenceGroup(fieldOfStringParams, paramOfStringParams, stringType).addEquivalenceGroup(fieldOfGenericOfInteger, paramOfGenericOfInteger, integerType);
    tester.test();
}
Also used : Types(javax.lang.model.util.Types) TypeMirror(javax.lang.model.type.TypeMirror) TypeElement(javax.lang.model.element.TypeElement) VariableElement(javax.lang.model.element.VariableElement) Elements(javax.lang.model.util.Elements) DeclaredType(javax.lang.model.type.DeclaredType) Test(org.junit.Test)

Example 92 with Types

use of javax.lang.model.util.Types in project auto by google.

the class FactoryDescriptorGenerator method generateDescriptorForConstructor.

FactoryMethodDescriptor generateDescriptorForConstructor(final AutoFactoryDeclaration declaration, ExecutableElement constructor) {
    checkNotNull(constructor);
    checkArgument(constructor.getKind() == ElementKind.CONSTRUCTOR);
    TypeElement classElement = MoreElements.asType(constructor.getEnclosingElement());
    Map<Boolean, List<VariableElement>> parameterMap = constructor.getParameters().stream().collect(partitioningBy(parameter -> isAnnotationPresent(parameter, Provided.class)));
    // The map returned by partitioningBy always has entries for both key values but our
    // null-checker isn't yet smart enough to know that.
    ImmutableSet<Parameter> providedParameters = Parameter.forParameterList(requireNonNull(parameterMap.get(true)), types);
    ImmutableSet<Parameter> passedParameters = Parameter.forParameterList(requireNonNull(parameterMap.get(false)), types);
    return FactoryMethodDescriptor.builder(declaration).name("create").returnType(classElement.asType()).publicMethod(classElement.getModifiers().contains(PUBLIC)).providedParameters(providedParameters).passedParameters(passedParameters).creationParameters(Parameter.forParameterList(constructor.getParameters(), types)).isVarArgs(constructor.isVarArgs()).exceptions(constructor.getThrownTypes()).overridingMethod(false).build();
}
Also used : Collectors.partitioningBy(java.util.stream.Collectors.partitioningBy) VariableElement(javax.lang.model.element.VariableElement) TypeElement(javax.lang.model.element.TypeElement) ERROR(javax.tools.Diagnostic.Kind.ERROR) Provided(com.google.auto.factory.Provided) Preconditions.checkArgument(com.google.common.base.Preconditions.checkArgument) FluentIterable(com.google.common.collect.FluentIterable) Objects.requireNonNull(java.util.Objects.requireNonNull) Map(java.util.Map) MoreElements.isAnnotationPresent(com.google.auto.common.MoreElements.isAnnotationPresent) Messager(javax.annotation.processing.Messager) MoreElements(com.google.auto.common.MoreElements) AutoFactory(com.google.auto.factory.AutoFactory) Function(com.google.common.base.Function) ImmutableSet(com.google.common.collect.ImmutableSet) ABSTRACT(javax.lang.model.element.Modifier.ABSTRACT) ElementKind(javax.lang.model.element.ElementKind) PUBLIC(javax.lang.model.element.Modifier.PUBLIC) ExecutableElement(javax.lang.model.element.ExecutableElement) Preconditions.checkNotNull(com.google.common.base.Preconditions.checkNotNull) Element(javax.lang.model.element.Element) Types(javax.lang.model.util.Types) AnnotationMirror(javax.lang.model.element.AnnotationMirror) List(java.util.List) ElementKindVisitor6(javax.lang.model.util.ElementKindVisitor6) Optional(java.util.Optional) TypeElement(javax.lang.model.element.TypeElement) List(java.util.List)

Example 93 with Types

use of javax.lang.model.util.Types in project CoreData by FangCloud-Android.

the class Utils method getProperties.

public static List<Property> getProperties(ProcessingEnvironment env, List<Element> elements, Element primaryKey) {
    Elements elementUtils = env.getElementUtils();
    Types typeUtils = env.getTypeUtils();
    List<Property> propertyList = new ArrayList<>();
    for (Element element : elements) {
        String columnName = Utils.getColumnName(element);
        TypeName dbBaseType;
        TypeMirror typeMirror = element.asType();
        TypeName typeNameElement = ClassName.get(typeMirror);
        if (Utils.isBaseType(typeNameElement)) {
            dbBaseType = typeNameElement;
        } else {
            TypeElement elementFieldType = (TypeElement) typeUtils.asElement(typeMirror);
            Relation annotationRelation = element.getAnnotation(Relation.class);
            if (annotationRelation != null) {
                // 关联数据
                Entity relationEntity = elementFieldType.getAnnotation(Entity.class);
                if (relationEntity == null) {
                    throw new IllegalStateException("@Relation 添加的属性必须是 @Entity 的类");
                }
                EntityDetail relationEntityDetail = EntityDetail.parse(env, elementFieldType);
                Element relationEntityPrimaryKey = relationEntityDetail.getPrimaryKey();
                if (relationEntityPrimaryKey == null) {
                    throw new IllegalStateException(relationEntityDetail.getEntityName() + "是关联类型,@Relation 属性必须有主键");
                }
                dbBaseType = ClassName.get(relationEntityPrimaryKey.asType());
            } else {
                Embedded embedded = element.getAnnotation(Embedded.class);
                if (embedded != null) {
                    // 内嵌数据, 循环解析内嵌结构的字段
                    List<Element> embeddedEleList = new ArrayList<>();
                    fillElementsForDbAndReturnPrimaryKey(env, embeddedEleList, (TypeElement) typeUtils.asElement(typeMirror));
                    propertyList.addAll(getProperties(env, embeddedEleList, null));
                    continue;
                } else {
                    Convert convert = element.getAnnotation(Convert.class);
                    if (convert != null) {
                        TypeName classConvertDb = Utils.getConvertDbType(convert);
                        if (Utils.isBaseType(classConvertDb)) {
                            dbBaseType = classConvertDb;
                        } else {
                            throw new IllegalStateException(element.getSimpleName() + "converter dbtype is not a base type");
                        }
                    } else {
                        throw new IllegalStateException(element.getSimpleName() + " is a complex structure field," + "must indicate it as @Relation or @Embedded, " + "or supply a @Convert for it");
                    }
                }
            }
        }
        propertyList.add(new Property(columnName, Utils.getTypeByTypeName(dbBaseType), element == primaryKey));
    }
    return propertyList;
}
Also used : Types(javax.lang.model.util.Types) Entity(com.coredata.annotation.Entity) TypeName(com.squareup.javapoet.TypeName) Convert(com.coredata.annotation.Convert) TypeElement(javax.lang.model.element.TypeElement) Element(javax.lang.model.element.Element) TypeElement(javax.lang.model.element.TypeElement) ArrayList(java.util.ArrayList) Elements(javax.lang.model.util.Elements) Relation(com.coredata.annotation.Relation) TypeMirror(javax.lang.model.type.TypeMirror) Embedded(com.coredata.annotation.Embedded) EntityDetail(com.coredata.compiler.EntityDetail) Property(com.coredata.db.Property)

Example 94 with Types

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

the class AttributeFieldValidation 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_ATTRIBUTE_FIELD_CLASS_NAME);
    for (Element e : roundEnv.getElementsAnnotatedWith(annotationElement)) {
        for (AnnotationMirror am : e.getAnnotationMirrors()) {
            if (typeUtils.isSameType(am.getAnnotationType(), annotationElement.asType())) {
                for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : am.getElementValues().entrySet()) {
                    String elementName = entry.getKey().getSimpleName().toString();
                    if (elementName.equals("beforeSet") || elementName.equals("afterSet")) {
                        String methodName = entry.getValue().getValue().toString();
                        if (!"".equals(methodName)) {
                            TypeElement parent = (TypeElement) e.getEnclosingElement();
                            if (!containsMethod(parent, methodName)) {
                                processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Could not find method '" + methodName + "' which is defined as the " + elementName + " action", e);
                            }
                        }
                    }
                }
            }
        }
    }
    return false;
}
Also used : Types(javax.lang.model.util.Types) SupportedAnnotationTypes(javax.annotation.processing.SupportedAnnotationTypes) AnnotationMirror(javax.lang.model.element.AnnotationMirror) TypeElement(javax.lang.model.element.TypeElement) ExecutableElement(javax.lang.model.element.ExecutableElement) Element(javax.lang.model.element.Element) TypeElement(javax.lang.model.element.TypeElement) Elements(javax.lang.model.util.Elements) Map(java.util.Map)

Example 95 with Types

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

the class ManagedAnnotationValidator method getErasure.

private TypeMirror getErasure(final String className) {
    final Types typeUtils = processingEnv.getTypeUtils();
    final Elements elementUtils = processingEnv.getElementUtils();
    return typeUtils.erasure(elementUtils.getTypeElement(className).asType());
}
Also used : Types(javax.lang.model.util.Types) SupportedAnnotationTypes(javax.annotation.processing.SupportedAnnotationTypes) Elements(javax.lang.model.util.Elements)

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