protected void processAnnotations() {
        processExclusions();

        Set<TypeElement> elements = collectElements();

        // create meta models
        for (Element element : elements) {
            typeFactory.getEntityType(element.asType(), false);
        }
        for (Element element : elements) {
            typeFactory.getEntityType(element.asType(), true);
        }

        // add properties
        boolean embeddableAnn = conf.getEmbeddableAnnotation() != null;
        boolean altEntityAnn = conf.getAlternativeEntityAnnotation() != null;
        boolean superAnn = conf.getSuperTypeAnnotation() != null;
        for (TypeElement element : elements) {
            EntityType entityType = elementHandler.handleEntityType(element);
            registerTypeElement(entityType.getFullName(), element);
            if (typeFactory.isSimpleTypeEntity(element, conf.getEntityAnnotation())) {
                context.entityTypes.put(entityType.getFullName(), entityType);
            } else if (altEntityAnn && element.getAnnotation(conf.getAlternativeEntityAnnotation()) != null) {
                context.entityTypes.put(entityType.getFullName(), entityType);
            } else if (embeddableAnn && element.getAnnotation(conf.getEmbeddableAnnotation()) != null) {
                context.embeddableTypes.put(entityType.getFullName(), entityType);
            } else if (superAnn && element.getAnnotation(conf.getSuperTypeAnnotation()) != null) {
                context.supertypes.put(entityType.getFullName(), entityType);
            } else if (!entityType.getDelegates().isEmpty()) {
                context.extensionTypes.put(entityType.getFullName(), entityType);
            } else {
                context.embeddableTypes.put(entityType.getFullName(), entityType);
            }
            context.allTypes.put(entityType.getFullName(), entityType);
        }

        // track also methods from external entity types
        for (EntityType entityType : new ArrayList<EntityType>(typeFactory.getEntityTypes())) {
            String fullName = entityType.getFullName();
            if (!context.allTypes.keySet().contains(fullName)) {
                TypeElement element = processingEnv.getElementUtils().getTypeElement(fullName);
                if (element != null) {
                    elementHandler.handleEntityType(element);
                }
            }
        }

        // add external parents
        for (Element element : elements) {
            EntityType entityType = typeFactory.getEntityType(element.asType(), false);
            addExternalParents(entityType);
        }

        // add properties from parents
        Set<EntityType> handled = new HashSet<EntityType>();
        for (EntityType entityType : context.allTypes.values()) {
            addSupertypeFields(entityType, handled);
        }

        processProjectionTypes(elements);

        // extend entity types
        typeFactory.extendTypes();

        context.clean();

    }
{@code AbstractQuerydslProcessor} is the base class for Querydsl annotation processors and
contains the main processing logic. The subclasses just provide the configuration.

@author tiwe
querydsl-apt/src/main/java/com/querydsl/apt/AbstractQuerydslProcessor.java