List of usage examples for javax.lang.model.element TypeElement getEnclosedElements
@Override
List<? extends Element> getEnclosedElements();
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; }