private Set<TypeElement> getAnnotationlessSupertypes(Set<TypeElement> elements) {
        Set<TypeElement> rv = new HashSet<TypeElement>();
        for (TypeElement element : elements) {
            TypeMirror superTypeMirror = element.getSuperclass();
            while (superTypeMirror != null) {
                TypeElement superTypeElement = (TypeElement) processingEnv.getTypeUtils().asElement(superTypeMirror);
                if (superTypeElement != null
                        && !superTypeElement.toString().startsWith("java.lang.")
                        && !TypeUtils.hasAnnotationOfType(superTypeElement, conf.getEntityAnnotations())) {
                    rv.add(superTypeElement);
                    superTypeMirror = superTypeElement.getSuperclass();
                    if (superTypeMirror instanceof NoType) {
                        superTypeMirror = null;
                    }
                } else {
                    superTypeMirror = null;
                }
            }
        }
        return rv;
    }
{@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