package com.qianwen.smart.core.auto.common; import java.util.ArrayList; import java.util.List; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; import javax.lang.model.element.QualifiedNameable; import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Types; public class TypeHelper { private final ProcessingEnvironment env; private final Types types; public TypeHelper(ProcessingEnvironment env) { this.env = env; this.types = env.getTypeUtils(); } public String getType(Element element) { return getType((element != null) ? element.asType() : null); } public String getType(AnnotationMirror annotation) { return getType((annotation != null) ? annotation.getAnnotationType() : null); } public String getType(TypeMirror type) { if (type == null) return null; if (type instanceof DeclaredType) { DeclaredType declaredType = (DeclaredType)type; Element enclosingElement = declaredType.asElement().getEnclosingElement(); if (enclosingElement != null && enclosingElement instanceof javax.lang.model.element.TypeElement) return getQualifiedName(enclosingElement) + "$" + declaredType.asElement().getSimpleName().toString(); return getQualifiedName(declaredType.asElement()); } return type.toString(); } private String getQualifiedName(Element element) { if (element instanceof QualifiedNameable) return ((QualifiedNameable)element).getQualifiedName().toString(); return element.toString(); } public Element getSuperClass(Element element) { List superTypes = this.types.directSupertypes(element.asType()); if (superTypes.isEmpty()) return null; return this.types.asElement(superTypes.get(0)); } public List getDirectInterfaces(Element element) { List superTypes = this.types.directSupertypes(element.asType()); List directInterfaces = new ArrayList<>(); if (superTypes.size() > 1) for (int i = 1; i < superTypes.size(); i++) { Element e = this.types.asElement(superTypes.get(i)); if (e != null) directInterfaces.add(e); } return directInterfaces; } public List getAllAnnotationMirrors(Element e) { return this.env.getElementUtils().getAllAnnotationMirrors(e); } }