private Set<TypeElement> processDelegateMethods() {
        Set<? extends Element> delegateMethods = getElements(QueryDelegate.class);
        Set<TypeElement> typeElements = new HashSet<TypeElement>();

        for (Element delegateMethod : delegateMethods) {
            ExecutableElement method = (ExecutableElement) delegateMethod;
            Element element = delegateMethod.getEnclosingElement();
            String name = method.getSimpleName().toString();
            Type delegateType = typeFactory.getType(element.asType(), true);
            Type returnType = typeFactory.getType(method.getReturnType(), true);
            List<Parameter> parameters = elementHandler.transformParams(method.getParameters());
            // remove first element
            parameters = parameters.subList(1, parameters.size());

            EntityType entityType = null;
            for (AnnotationMirror annotation : delegateMethod.getAnnotationMirrors()) {
                if (TypeUtils.isAnnotationMirrorOfType(annotation, QueryDelegate.class)) {
                    TypeMirror type = TypeUtils.getAnnotationValueAsTypeMirror(annotation, "value");
                    if (type != null) {
                        entityType = typeFactory.getEntityType(type, true);
                    }
                }
            }

            if (entityType != null) {
                registerTypeElement(entityType.getFullName(), (TypeElement) element);
                entityType.addDelegate(new Delegate(entityType, delegateType, name, parameters, returnType));
                TypeElement typeElement = processingEnv.getElementUtils().getTypeElement(entityType.getFullName());
                boolean isAnnotated = false;
                for (Class<? extends Annotation> ann : conf.getEntityAnnotations()) {
                    if (typeElement.getAnnotation(ann) != null) {
                        isAnnotated = true;
                    }
                }
                if (isAnnotated) {
                    // handle also properties of entity type
                    typeElements.add(processingEnv.getElementUtils().getTypeElement(entityType.getFullName()));
                } else {
                    // skip handling properties
                    context.extensionTypes.put(entityType.getFullName(), entityType);
                    context.allTypes.put(entityType.getFullName(), entityType);
                }
            }
        }

        return typeElements;
    }
{@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