Example usage for javax.lang.model.element TypeElement getEnclosedElements

List of usage examples for javax.lang.model.element TypeElement getEnclosedElements

Introduction

In this page you can find the example usage for javax.lang.model.element TypeElement getEnclosedElements.

Prototype

@Override
List<? extends Element> getEnclosedElements();

Source Link

Document

Returns the fields, methods, constructors, and member types that are directly declared in this class or interface.

Usage

From source file:com.dspot.declex.server.ServerModelHandler.java

private void getFieldsAndMethods(TypeElement element, Map<String, String> fields, Map<String, String> methods) {
    List<? extends Element> elems = element.getEnclosedElements();
    for (Element elem : elems) {
        final String elemName = elem.getSimpleName().toString();
        final String elemType = elem.asType().toString();

        //Static methods are included
        if (methods != null) {
            if (elem.getKind() == ElementKind.METHOD) {
                if (elem.getModifiers().contains(Modifier.PRIVATE))
                    continue;

                ExecutableElement executableElement = (ExecutableElement) elem;

                //One parameter means that the method can be used to update the model
                if (executableElement.getParameters().size() == 1) {
                    VariableElement param = executableElement.getParameters().get(0);
                    methods.put(elemName,
                            TypeUtils.typeFromTypeString(param.asType().toString(), getEnvironment()));
                }/*from   w  w w .  ja v  a2 s.  c o m*/
            }
        }

        if (elem.getModifiers().contains(Modifier.STATIC))
            continue;

        if (fields != null) {
            if (elem.getKind() == ElementKind.FIELD) {
                if (elem.getModifiers().contains(Modifier.PRIVATE))
                    continue;

                fields.put(elemName, TypeUtils.typeFromTypeString(elemType, getEnvironment()));
            }
        }
    }

    //Apply to Extensions
    List<? extends TypeMirror> superTypes = getProcessingEnvironment().getTypeUtils()
            .directSupertypes(element.asType());
    for (TypeMirror type : superTypes) {
        TypeElement superElement = getProcessingEnvironment().getElementUtils().getTypeElement(type.toString());

        if (superElement.getAnnotation(Extension.class) != null) {
            getFieldsAndMethods(superElement, fields, methods);
        }

        break;
    }
}

From source file:auto.parse.processor.AutoParseProcessor.java

private String getSerialVersionUID(TypeElement type) {
    Types typeUtils = processingEnv.getTypeUtils();
    TypeMirror serializable = getTypeMirror(Serializable.class);
    if (typeUtils.isAssignable(type.asType(), serializable)) {
        List<VariableElement> fields = ElementFilter.fieldsIn(type.getEnclosedElements());
        for (VariableElement field : fields) {
            if (field.getSimpleName().toString().equals("serialVersionUID")) {
                Object value = field.getConstantValue();
                if (field.getModifiers().containsAll(Arrays.asList(Modifier.STATIC, Modifier.FINAL))
                        && field.asType().getKind() == TypeKind.LONG && value != null) {
                    return value + "L";
                } else {
                    reportError("serialVersionUID must be a static final long compile-time constant", field);
                    break;
                }/*from   w ww.  ja  v a  2 s. c  om*/
            }
        }
    }
    return "";
}

From source file:com.contentful.vault.compiler.Processor.java

private void parseContentType(TypeElement element, Map<TypeElement, ModelInjection> models) {
    String id = element.getAnnotation(ContentType.class).value();
    if (id.isEmpty()) {
        error(element, "@%s id may not be empty. (%s)", ContentType.class.getSimpleName(),
                element.getQualifiedName());
        return;//from w  w  w.ja  va 2 s.c o m
    }

    if (!isSubtypeOfType(element.asType(), Resource.class.getName())) {
        error(element, "Classes annotated with @%s must extend \"" + Resource.class.getName() + "\". (%s)",
                ContentType.class.getSimpleName(), element.getQualifiedName());
        return;
    }

    Set<FieldMeta> fields = new LinkedHashSet<>();
    Set<String> memberIds = new LinkedHashSet<>();
    for (Element enclosedElement : element.getEnclosedElements()) {
        Field field = enclosedElement.getAnnotation(Field.class);
        if (field == null) {
            continue;
        }

        String fieldId = field.value();
        if (fieldId.isEmpty()) {
            fieldId = enclosedElement.getSimpleName().toString();
        }

        Set<Modifier> modifiers = enclosedElement.getModifiers();
        if (modifiers.contains(Modifier.STATIC)) {
            error(element, "@%s elements must not be static. (%s.%s)", Field.class.getSimpleName(),
                    element.getQualifiedName(), enclosedElement.getSimpleName());
            return;
        }
        if (modifiers.contains(Modifier.PRIVATE)) {
            error(element, "@%s elements must not be private. (%s.%s)", Field.class.getSimpleName(),
                    element.getQualifiedName(), enclosedElement.getSimpleName());
            return;
        }

        if (!memberIds.add(fieldId)) {
            error(element, "@%s for the same id (\"%s\") was used multiple times in the same class. (%s)",
                    Field.class.getSimpleName(), fieldId, element.getQualifiedName());
            return;
        }

        FieldMeta.Builder fieldBuilder = FieldMeta.builder();
        if (isList(enclosedElement)) {
            DeclaredType declaredType = (DeclaredType) enclosedElement.asType();
            List<? extends TypeMirror> typeArguments = declaredType.getTypeArguments();
            if (typeArguments.size() == 0) {
                error(element, "Array fields must have a type parameter specified. (%s.%s)",
                        element.getQualifiedName(), enclosedElement.getSimpleName());
                return;
            }

            TypeMirror arrayType = typeArguments.get(0);
            if (!isValidListType(arrayType)) {
                error(element, "Invalid list type \"%s\" specified. (%s.%s)", arrayType.toString(),
                        element.getQualifiedName(), enclosedElement.getSimpleName());
                return;
            }

            String sqliteType = null;
            if (String.class.getName().equals(arrayType.toString())) {
                sqliteType = SqliteUtils.typeForClass(List.class.getName());
            }

            fieldBuilder.setSqliteType(sqliteType).setArrayType(arrayType.toString());
        } else {
            TypeMirror enclosedType = enclosedElement.asType();
            String linkType = getLinkType(enclosedType);
            String sqliteType = null;
            if (linkType == null) {
                sqliteType = SqliteUtils.typeForClass(enclosedType.toString());
                if (sqliteType == null) {
                    error(element, "@%s specified for unsupported type (\"%s\"). (%s.%s)",
                            Field.class.getSimpleName(), enclosedType.toString(), element.getQualifiedName(),
                            enclosedElement.getSimpleName());
                    return;
                }
            }

            fieldBuilder.setSqliteType(sqliteType).setLinkType(linkType);
        }

        fields.add(fieldBuilder.setId(fieldId).setName(enclosedElement.getSimpleName().toString())
                .setType(enclosedElement.asType()).build());
    }

    if (fields.size() == 0) {
        error(element, "Model must contain at least one @%s element. (%s)", Field.class.getSimpleName(),
                element.getQualifiedName());
        return;
    }

    ClassName injectionClassName = getInjectionClassName(element, SUFFIX_MODEL);
    String tableName = "entry_" + SqliteUtils.hashForId(id);
    models.put(element, new ModelInjection(id, injectionClassName, element, tableName, fields));
}

From source file:co.touchlab.squeaky.processor.AnnotationProcessor.java

private boolean processTableViewQuery(List<DatabaseTableHolder> tableHolders, Element annotatedElement,
        EntityType entityType) {//from www  . j  a v  a2s. c  om
    TypeElement typeElement = (TypeElement) annotatedElement;
    String fromString;

    switch (entityType) {
    case Table:
    case View:
        fromString = extractTableName(typeElement);
        break;
    case Query:
        fromString = "(" + typeElement.getAnnotation(DatabaseQuery.class).fromQuery() + ")";
        break;
    default:
        throw new RuntimeException("No type (this will NEVER happen)");
    }

    List<FieldTypeGen> fieldTypeGens = new ArrayList<FieldTypeGen>();
    List<ForeignCollectionHolder> foreignCollectionInfos = new ArrayList<ForeignCollectionHolder>();

    // walk up the classes finding the fields
    TypeElement working = typeElement;
    while (working != null) {
        for (Element element : working.getEnclosedElements()) {

            if (element.getKind().isField()) {
                if (element.getAnnotation(DatabaseField.class) != null) {
                    FieldTypeGen fieldTypeGen = new FieldTypeGen(annotatedElement, element, typeUtils,
                            messager);

                    fieldTypeGens.add(fieldTypeGen);

                } else if (element.getAnnotation(ForeignCollectionField.class) != null) {
                    ForeignCollectionField foreignCollectionField = element
                            .getAnnotation(ForeignCollectionField.class);
                    foreignCollectionInfos.add(new ForeignCollectionHolder(foreignCollectionField,
                            (VariableElement) element, messager));
                }
            }
        }
        if (working.getSuperclass().getKind().equals(TypeKind.NONE)) {
            break;
        }
        working = (TypeElement) typeUtils.asElement(working.getSuperclass());
    }
    if (fieldTypeGens.isEmpty()) {
        error(typeElement,
                "Every class annnotated with %s, %s, or %s must have at least 1 field annotated with %s",
                DatabaseTable.class.getSimpleName(), DatabaseView.class.getSimpleName(),
                DatabaseQuery.class.getSimpleName(), DatabaseField.class.getSimpleName());
        return true;
    }

    List<FieldTypeGen> testFields = fieldTypeGens;
    List<FieldTypeGen> finalFields = new ArrayList<FieldTypeGen>();
    for (FieldTypeGen testField : testFields) {
        if (testField.finalField)
            finalFields.add(testField);
    }

    ExecutableElement finalConstructor = null;

    if (!finalFields.isEmpty()) {
        List<ExecutableElement> executableElements = ElementFilter
                .constructorsIn(annotatedElement.getEnclosedElements());
        for (ExecutableElement executableElement : executableElements) {
            List<FieldTypeGen> finalFieldsCheck = new ArrayList<FieldTypeGen>(finalFields);
            List<? extends VariableElement> parameters = executableElement.getParameters();
            for (VariableElement parameter : parameters) {
                String fieldName = parameter.getSimpleName().toString();
                String fieldClassname = DataTypeManager.findFieldClassname(parameter);

                Iterator<FieldTypeGen> iterator = finalFieldsCheck.iterator();
                boolean found = false;
                while (iterator.hasNext()) {
                    FieldTypeGen next = iterator.next();
                    if (next.fieldName.equals(fieldName) && next.dataTypeClassname.equals(fieldClassname)) {
                        found = true;
                        iterator.remove();
                    }
                }
                if (!found)
                    break;
            }

            if (finalFieldsCheck.isEmpty()) {
                finalConstructor = executableElement;
                break;
            }
        }

        if (finalConstructor == null) {
            List<String> allFinals = new ArrayList<String>();
            for (FieldTypeGen finalField : finalFields) {
                allFinals.add(finalField.fieldName);
            }
            error(annotatedElement, "Final fields need to be set in constructor %s",
                    StringUtils.join(allFinals, ","));
            return true;
        }
    }

    DatabaseTableHolder tableHolder = new DatabaseTableHolder(annotatedElement, fieldTypeGens,
            foreignCollectionInfos, typeElement, fromString, finalFields, finalConstructor, entityType);

    tableHolders.add(tableHolder);
    return false;
}

From source file:com.mastfrog.parameters.processor.Processor.java

private void checkConstructor(TypeElement el, GeneratedParamsClass inf) {
    Elements elements = processingEnv.getElementUtils();
    TypeElement pageParamsType = elements
            .getTypeElement("org.apache.wicket.request.mapper.parameter.PageParameters");
    TypeElement customParamsType = elements.getTypeElement(inf.qualifiedName());
    boolean found = false;
    boolean foundArgument = false;
    ExecutableElement con = null;
    outer: for (Element sub : el.getEnclosedElements()) {
        switch (sub.getKind()) {
        case CONSTRUCTOR:
            for (AnnotationMirror mir : sub.getAnnotationMirrors()) {
                DeclaredType type = mir.getAnnotationType();
                switch (type.toString()) {
                case "javax.inject.Inject":
                case "com.google.inject.Inject":
                    ExecutableElement constructor = (ExecutableElement) sub;
                    con = constructor;/*from w  w w  .j  ava 2 s. c  o  m*/
                    for (VariableElement va : constructor.getParameters()) {
                        TypeMirror varType = va.asType();
                        if (pageParamsType != null && varType.toString().equals(pageParamsType.toString())) {
                            foundArgument = true;
                            break;
                        }
                        if (customParamsType != null
                                && varType.toString().equals(customParamsType.toString())) {
                            foundArgument = true;
                            break;
                        } else if (customParamsType == null && inf.qualifiedName().equals(varType.toString())) { //first compilation - type not generated yet
                            foundArgument = true;
                            break;
                        }
                    }
                    found = true;
                    break outer;
                default:
                    //do nothing
                }
            }
        }
    }
    if (!found) {
        processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Usually a constructor "
                + "annotated with @Inject that takes a " + inf.className + " is desired", el);
    } else if (found && !foundArgument) {
        processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING,
                "Usually a constructor taking " + "an argument of " + inf.className + " is desired", con);
    }
}

From source file:org.kie.workbench.common.stunner.core.processors.MainProcessor.java

private void processMorphProperties(final TypeElement classElement, final String definitionClassName) {
    final Messager messager = processingEnv.getMessager();
    final Elements elementUtils = processingEnv.getElementUtils();
    List<VariableElement> variableElements = ElementFilter.fieldsIn(classElement.getEnclosedElements());
    for (VariableElement variableElement : variableElements) {
        if (GeneratorUtils.getAnnotation(elementUtils, variableElement, ANNOTATION_MORPH_PROPERTY) != null) {
            final TypeMirror fieldReturnType = variableElement.asType();
            final String fieldReturnTypeName = GeneratorUtils.getTypeMirrorDeclaredName(fieldReturnType);
            final String fieldName = variableElement.getSimpleName().toString();
            messager.printMessage(Diagnostic.Kind.NOTE,
                    "Discovered Morph Property " + "for class [" + classElement.getSimpleName() + "] "
                            + "at field [" + fieldName + "] " + "of return type [" + fieldReturnTypeName + "]");
            // MorphBase - defaultType
            MorphProperty morphBaseAnn = variableElement.getAnnotation(MorphProperty.class);
            TypeMirror morphDefaultTypeMirror = null;
            try {
                Class<?> defaultTypeClass = morphBaseAnn.binder();
            } catch (MirroredTypeException mte) {
                morphDefaultTypeMirror = mte.getTypeMirror();
            }/*from ww w .j a  va2  s.c o  m*/
            if (null == morphDefaultTypeMirror) {
                throw new RuntimeException("No binder class specifyed for the @MorphProperty.");
            }
            String binderClassName = morphDefaultTypeMirror.toString();
            ProcessingMorphProperty morphProperty = new ProcessingMorphProperty(fieldReturnTypeName,
                    StringUtils.capitalize(fieldName), binderClassName);
            List<ProcessingMorphProperty> morphProperties = processingContext.getMorphingAnnotations()
                    .getBaseMorphProperties().get(definitionClassName);
            if (null == morphProperties) {
                morphProperties = new LinkedList<>();
                processingContext.getMorphingAnnotations().getBaseMorphProperties().put(definitionClassName,
                        morphProperties);
            }
            morphProperties.add(morphProperty);
        }
    }
}

From source file:org.kie.workbench.common.stunner.core.processors.MainProcessor.java

private TypeElement getDefinitionInheritedType(TypeElement classElement) {
    final Elements elementUtils = processingEnv.getElementUtils();
    classElement = getParent(classElement);
    while (!classElement.toString().equals(Object.class.getName())) {
        List<VariableElement> variableElements = ElementFilter.fieldsIn(classElement.getEnclosedElements());
        for (VariableElement variableElement : variableElements) {
            for (String annotation : DEFINITION_ANNOTATIONS) {
                if (GeneratorUtils.getAnnotation(elementUtils, variableElement, annotation) != null) {
                    return classElement;
                }/* ww w . ja va2 s. c o m*/
            }
        }
        classElement = getParent(classElement);
    }
    return null;
}

From source file:com.googlecode.androidannotations.helper.ValidatorHelper.java

public void unannotatedMethodReturnsRestTemplate(TypeElement typeElement, IsValid valid) {
    List<? extends Element> enclosedElements = typeElement.getEnclosedElements();
    boolean foundGetRestTemplateMethod = false;
    boolean foundSetRestTemplateMethod = false;
    boolean foundSetRootUrlMethod = false;
    for (Element enclosedElement : enclosedElements) {
        if (enclosedElement.getKind() != ElementKind.METHOD) {
            valid.invalidate();// ww  w  .  j ava 2 s  .c o m
            annotationHelper.printError(enclosedElement, "Only methods are allowed in a "
                    + TargetAnnotationHelper.annotationName(Rest.class) + " annotated interface");
        } else {

            boolean hasRestAnnotation = false;
            for (Class<? extends Annotation> annotationClass : REST_ANNOTATION_CLASSES) {
                if (enclosedElement.getAnnotation(annotationClass) != null) {
                    hasRestAnnotation = true;
                    break;
                }
            }

            if (!hasRestAnnotation) {
                ExecutableElement executableElement = (ExecutableElement) enclosedElement;
                TypeMirror returnType = executableElement.getReturnType();
                if (returnType.toString().equals(CanonicalNameConstants.REST_TEMPLATE)) {
                    if (executableElement.getParameters().size() > 0) {
                        valid.invalidate();
                        annotationHelper.printError(enclosedElement,
                                "The method returning a RestTemplate should not declare any parameter in a "
                                        + TargetAnnotationHelper.annotationName(Rest.class)
                                        + " annotated interface");
                    } else {
                        if (foundGetRestTemplateMethod) {
                            valid.invalidate();
                            annotationHelper.printError(enclosedElement,
                                    "Only one method should declare returning a RestTemplate in a "
                                            + TargetAnnotationHelper.annotationName(Rest.class)
                                            + " annotated interface");
                        } else {
                            foundGetRestTemplateMethod = true;
                        }
                    }
                } else if (returnType.getKind() == TypeKind.VOID) {
                    List<? extends VariableElement> parameters = executableElement.getParameters();
                    if (parameters.size() == 1) {
                        VariableElement firstParameter = parameters.get(0);
                        if (firstParameter.asType().toString().equals(CanonicalNameConstants.REST_TEMPLATE)) {
                            if (!foundSetRestTemplateMethod) {
                                foundSetRestTemplateMethod = true;
                            } else {
                                valid.invalidate();
                                annotationHelper.printError(enclosedElement,
                                        "You can only have oneRestTemplate setter method on a "
                                                + TargetAnnotationHelper.annotationName(Rest.class)
                                                + " annotated interface");

                            }
                        } else if (executableElement.getSimpleName().toString().equals(METHOD_NAME_SET_ROOT_URL)
                                && !foundSetRootUrlMethod) {
                            foundSetRootUrlMethod = true;
                        } else {
                            valid.invalidate();
                            annotationHelper.printError(enclosedElement,
                                    "The method to set a RestTemplate should have only one RestTemplate parameter on a "
                                            + TargetAnnotationHelper.annotationName(Rest.class)
                                            + " annotated interface");

                        }
                    } else {
                        valid.invalidate();
                        annotationHelper.printError(enclosedElement,
                                "The method to set a RestTemplate should have only one RestTemplate parameter on a "
                                        + TargetAnnotationHelper.annotationName(Rest.class)
                                        + " annotated interface");
                    }
                } else {
                    valid.invalidate();
                    annotationHelper.printError(enclosedElement, "All methods should be annotated in a "
                            + TargetAnnotationHelper.annotationName(Rest.class)
                            + " annotated interface, except the ones that returns or set a RestTemplate");
                }
            }
        }
    }
}

From source file:org.kie.workbench.common.stunner.core.processors.MainProcessor.java

private Map<String, Element> getFieldNames(TypeElement classElement, String annotation) {
    final Messager messager = processingEnv.getMessager();
    final Elements elementUtils = processingEnv.getElementUtils();
    Map<String, Element> result = new LinkedHashMap<>();
    while (!classElement.toString().equals(Object.class.getName())) {
        List<VariableElement> variableElements = ElementFilter.fieldsIn(classElement.getEnclosedElements());
        for (VariableElement variableElement : variableElements) {
            if (GeneratorUtils.getAnnotation(elementUtils, variableElement, annotation) != null) {
                final TypeMirror fieldReturnType = variableElement.asType();
                final TypeElement t = (TypeElement) ((DeclaredType) fieldReturnType).asElement();
                final String fieldReturnTypeName = GeneratorUtils.getTypeMirrorDeclaredName(fieldReturnType);
                final String fieldName = variableElement.getSimpleName().toString();
                result.put(fieldName, t);
                messager.printMessage(Diagnostic.Kind.NOTE,
                        "Discovered property value " + "for class [" + classElement.getSimpleName() + "] "
                                + "at field [" + fieldName + "] " + "of return type [" + fieldReturnTypeName
                                + "]");
            }//from  ww  w.  j a  va 2 s  .  co  m
        }
        classElement = getParent(classElement);
    }
    return result;
}

From source file:uniol.apt.compiler.AbstractServiceProcessor.java

private boolean isValidClass(Element ele) {
    if (ele.getKind() != ElementKind.CLASS) {
        error(ele, "Non-Class %s annotated with %s.", ele.getSimpleName().toString(),
                this.annotationClass.getCanonicalName());
    }/*from w ww .j a  v a  2 s . c  o  m*/

    TypeElement classEle = (TypeElement) ele;

    if (!classEle.getModifiers().contains(Modifier.PUBLIC)) {
        error(classEle, "Class %s is not public.", classEle.getQualifiedName().toString());
        return false;
    }

    if (classEle.getModifiers().contains(Modifier.ABSTRACT)) {
        error(classEle, "Class %s is abstract.", classEle.getQualifiedName().toString());
        return false;
    }

    TypeMirror expected = this.types.erasure(this.elements.getTypeElement(this.interfaceName).asType());
    boolean found = false;
    for (TypeMirror actual : classEle.getInterfaces()) {
        if (this.types.isAssignable(actual, expected)) {
            found = true;
            break;
        }
    }
    if (!found) {
        error(classEle, "Class %s doesn't implement interface %s.", classEle.getQualifiedName().toString(),
                this.interfaceName);
        return false;
    }

    if (!allowGenerics && !classEle.getTypeParameters().isEmpty()) {
        error(classEle, "Class %s is generic.", classEle.getQualifiedName().toString());
        return false;
    }

    for (Element enclosed : classEle.getEnclosedElements()) {
        if (enclosed.getKind() == ElementKind.CONSTRUCTOR) {
            ExecutableElement constructorEle = (ExecutableElement) enclosed;
            if (constructorEle.getParameters().size() == 0
                    && constructorEle.getModifiers().contains(Modifier.PUBLIC)) {
                return true;
            }
        }
    }

    error(classEle, String.format("Class %s needs an public no-arg constructor",
            classEle.getQualifiedName().toString()));
    return false;
}