Search in sources :

Example 1 with AnnotatedAndRootElements

use of org.androidannotations.internal.model.AnnotationElements.AnnotatedAndRootElements in project androidannotations by androidannotations.

the class ModelProcessor method process.

@SuppressWarnings({ "unchecked", "rawtypes" })
public ProcessResult process(AnnotationElements validatedModel) throws Exception {
    ProcessHolder processHolder = new ProcessHolder(environment.getProcessingEnvironment());
    environment.setProcessHolder(processHolder);
    LOGGER.info("Processing root elements");
    /*
		 * We generate top classes then inner classes, then inner classes of
		 * inner classes, etc... until there is no more classes to generate.
		 */
    while (generateElements(validatedModel, processHolder)) {
        // CHECKSTYLE:OFF
        ;
    // CHECKSTYLE:ON
    }
    LOGGER.info("Processing enclosed elements");
    for (AnnotationHandler annotationHandler : environment.getDecoratingHandlers()) {
        if (!annotationHandler.isEnabled()) {
            continue;
        }
        String annotationName = annotationHandler.getTarget();
        /*
			 * For ancestors, the annotationHandler manipulates the annotated
			 * elements, but uses the holder for the root element
			 */
        Set<AnnotatedAndRootElements> ancestorAnnotatedElements = validatedModel.getAncestorAnnotatedElements(annotationName);
        if (!ancestorAnnotatedElements.isEmpty()) {
            LOGGER.debug("Processing enclosed elements with {}: {}", annotationHandler.getClass().getSimpleName(), ancestorAnnotatedElements);
        }
        for (AnnotatedAndRootElements elements : ancestorAnnotatedElements) {
            GeneratedClassHolder holder = processHolder.getGeneratedClassHolder(elements.rootTypeElement);
            /*
				 * Annotations coming from ancestors may be applied to root
				 * elements that are not validated, and therefore not available.
				 */
            if (holder != null) {
                processThrowing(annotationHandler, elements.annotatedElement, holder);
            }
        }
        Set<? extends Element> rootAnnotatedElements = validatedModel.getRootAnnotatedElements(annotationName);
        for (Element annotatedElement : rootAnnotatedElements) {
            Element enclosingElement;
            if (annotatedElement instanceof TypeElement) {
                enclosingElement = annotatedElement;
            } else {
                enclosingElement = annotatedElement.getEnclosingElement();
                /*
					 * we are processing a method parameter
					 */
                if (enclosingElement instanceof ExecutableElement) {
                    enclosingElement = enclosingElement.getEnclosingElement();
                }
            }
            /*
				 * We do not generate code for elements belonging to abstract
				 * classes, because the generated classes are final anyway
				 */
            if (!isAbstractClass(enclosingElement)) {
                GeneratedClassHolder holder = processHolder.getGeneratedClassHolder(enclosingElement);
                /*
					 * The holder can be null if the annotated holder class is
					 * already invalidated.
					 */
                if (holder != null) {
                    processThrowing(annotationHandler, annotatedElement, holder);
                }
            } else {
                LOGGER.trace("Skip element {} because enclosing element {} is abstract", annotatedElement, enclosingElement);
            }
        }
    }
    return new //
    ProcessResult(//
    processHolder.codeModel(), processHolder.getOriginatingElements());
}
Also used : GeneratedClassHolder(org.androidannotations.holder.GeneratedClassHolder) TypeElement(javax.lang.model.element.TypeElement) ExecutableElement(javax.lang.model.element.ExecutableElement) Element(javax.lang.model.element.Element) TypeElement(javax.lang.model.element.TypeElement) ExecutableElement(javax.lang.model.element.ExecutableElement) AnnotationHandler(org.androidannotations.handler.AnnotationHandler) GeneratingAnnotationHandler(org.androidannotations.handler.GeneratingAnnotationHandler) AnnotatedAndRootElements(org.androidannotations.internal.model.AnnotationElements.AnnotatedAndRootElements)

Aggregations

Element (javax.lang.model.element.Element)1 ExecutableElement (javax.lang.model.element.ExecutableElement)1 TypeElement (javax.lang.model.element.TypeElement)1 AnnotationHandler (org.androidannotations.handler.AnnotationHandler)1 GeneratingAnnotationHandler (org.androidannotations.handler.GeneratingAnnotationHandler)1 GeneratedClassHolder (org.androidannotations.holder.GeneratedClassHolder)1 AnnotatedAndRootElements (org.androidannotations.internal.model.AnnotationElements.AnnotatedAndRootElements)1