package com.webcohesion.enunciate.modules.lombok; import com.webcohesion.enunciate.javac.decorations.DecoratedProcessingEnvironment; import com.webcohesion.enunciate.javac.decorations.SourcePosition; import com.webcohesion.enunciate.javac.decorations.adaptors.ExecutableElementAdaptor; import com.webcohesion.enunciate.javac.decorations.element.ElementUtils; import javax.lang.model.element.*; import javax.lang.model.type.*; import java.lang.annotation.Annotation; import java.util.Collections; import java.util.EnumSet; import java.util.List; import java.util.Set; /** * @author Ryan Heaton */ public class LombokGeneratedGetter implements ExecutableElementAdaptor { private final VariableElement var; private final DecoratedProcessingEnvironment env; private final Name simpleName; public LombokGeneratedGetter(VariableElement var, DecoratedProcessingEnvironment env) { this.var = var; this.env = env; this.simpleName = this.env.getElementUtils().getName("get" + ElementUtils.capitalize(this.var.getSimpleName().toString())); } @Override public List<? extends TypeParameterElement> getTypeParameters() { return Collections.emptyList(); } @Override public TypeMirror getReturnType() { return this.var.asType(); } @Override public List<? extends VariableElement> getParameters() { return Collections.emptyList(); } @Override public boolean isVarArgs() { return false; } @Override public List<? extends TypeMirror> getThrownTypes() { return Collections.emptyList(); } @Override public AnnotationValue getDefaultValue() { return null; } @Override public Name getSimpleName() { return simpleName; } @Override public TypeMirror asType() { return new Type(); } @Override public ElementKind getKind() { return ElementKind.METHOD; } @Override public List<? extends AnnotationMirror> getAnnotationMirrors() { return this.var.getAnnotationMirrors(); } @Override public <A extends Annotation> A getAnnotation(Class<A> annotationType) { return this.var.getAnnotation(annotationType); } @Override public Set<Modifier> getModifiers() { return EnumSet.of(Modifier.PUBLIC); } @Override public Element getEnclosingElement() { return this.var.getEnclosingElement(); } @Override public List<? extends Element> getEnclosedElements() { return Collections.emptyList(); } @Override public <R, P> R accept(ElementVisitor<R, P> v, P p) { return v.visitExecutable(this, p); } @Override public boolean overrides(ExecutableElement overridden, TypeElement scope) { return (overridden instanceof LombokGeneratedGetter) && (this.env.getElementUtils().hides(this.var, ((LombokGeneratedGetter) overridden).var)); } @Override public String getDocComment() { String docComment = this.env.getElementUtils().getDocComment(this.var); if (docComment != null && !docComment.trim().isEmpty()) { return docComment + "\n@return " + this.var.getSimpleName().toString() + ' ' + docComment; } return null; } @Override public boolean isDeprecated() { return this.env.getElementUtils().isDeprecated(this.var); } @Override public boolean isOverriddenBy(ExecutableElement overrider, TypeElement type) { return (overrider instanceof LombokGeneratedGetter) && ((LombokGeneratedGetter) overrider).overrides(this, type); } @Override public PackageElement getPackage() { return this.env.getElementUtils().getPackageOf(this.var); } @Override public List<? extends AnnotationMirror> getAllAnnotationMirrors() { return this.env.getElementUtils().getAllAnnotationMirrors(this.var); } @Override public boolean hides(Element hidden) { return false; } @Override public boolean isHiddenBy(Element hider) { return false; } @Override public SourcePosition getSourcePosition() { return this.env.findSourcePosition(this.var); } private class Type implements ExecutableType { @Override public List<? extends TypeVariable> getTypeVariables() { return Collections.emptyList(); } @Override public TypeMirror getReturnType() { return var.asType(); } @Override public List<? extends TypeMirror> getParameterTypes() { return Collections.emptyList(); } @Override public List<? extends TypeMirror> getThrownTypes() { return Collections.emptyList(); } @Override public TypeKind getKind() { return TypeKind.EXECUTABLE; } @Override public <R, P> R accept(TypeVisitor<R, P> v, P p) { return v.visitExecutable(this, p); } } }