/**
* Copyright © 2006-2016 Web Cohesion (info@webcohesion.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.webcohesion.enunciate.javac.decorations;
import com.webcohesion.enunciate.javac.decorations.adaptors.ElementAdaptor;
import com.webcohesion.enunciate.javac.decorations.adaptors.ExecutableElementAdaptor;
import com.webcohesion.enunciate.javac.decorations.adaptors.TypeElementAdaptor;
import com.webcohesion.enunciate.javac.decorations.element.DecoratedAnnotationMirror;
import com.webcohesion.enunciate.javac.decorations.element.DecoratedElement;
import com.webcohesion.enunciate.javac.decorations.element.DecoratedExecutableElement;
import com.webcohesion.enunciate.javac.decorations.element.DecoratedTypeElement;
import javax.lang.model.element.*;
import javax.lang.model.util.Elements;
import java.io.Writer;
import java.util.List;
import java.util.Map;
/**
* @author Ryan Heaton
*/
public class DecoratedElements implements Elements {
private final Elements delegate;
private final DecoratedProcessingEnvironment env;
public DecoratedElements(Elements delegate, DecoratedProcessingEnvironment env) {
this.env = env;
while (delegate instanceof DecoratedElements) {
delegate = ((DecoratedElements) delegate).delegate;
}
this.delegate = delegate;
}
@Override
public PackageElement getPackageElement(CharSequence name) {
return ElementDecorator.decorate(delegate.getPackageElement(name), this.env);
}
@Override
public TypeElement getTypeElement(CharSequence name) {
return ElementDecorator.decorate(delegate.getTypeElement(name), this.env);
}
@Override
public Map<? extends ExecutableElement, ? extends AnnotationValue> getElementValuesWithDefaults(AnnotationMirror a) {
while (a instanceof DecoratedAnnotationMirror) {
a = ((DecoratedAnnotationMirror)a).getDelegate();
}
return delegate.getElementValuesWithDefaults(a);
}
@Override
public String getDocComment(Element e) {
while (e instanceof DecoratedElement) {
e = ((DecoratedElement) e).getDelegate();
}
String docComment;
if (e instanceof ElementAdaptor) {
docComment = ((ElementAdaptor) e).getDocComment();
}
else {
docComment = delegate.getDocComment(e);
}
return docComment;
}
@Override
public boolean isDeprecated(Element e) {
while (e instanceof DecoratedElement) {
e = ((DecoratedElement) e).getDelegate();
}
return e instanceof ElementAdaptor ? ((ElementAdaptor)e).isDeprecated() : delegate.isDeprecated(e);
}
@Override
public Name getBinaryName(TypeElement type) {
while (type instanceof DecoratedTypeElement) {
type = ((DecoratedTypeElement) type).getDelegate();
}
return type instanceof TypeElementAdaptor ? ((TypeElementAdaptor)type).getBinaryName() : delegate.getBinaryName(type);
}
@Override
public PackageElement getPackageOf(Element e) {
while (e instanceof DecoratedElement) {
e = ((DecoratedElement) e).getDelegate();
}
return e instanceof ElementAdaptor ? ((ElementAdaptor)e).getPackage() : ElementDecorator.decorate(delegate.getPackageOf(e), this.env);
}
@Override
public List<? extends Element> getAllMembers(TypeElement type) {
while (type instanceof DecoratedTypeElement) {
type = ((DecoratedTypeElement) type).getDelegate();
}
return type instanceof TypeElementAdaptor ? ((TypeElementAdaptor)type).getAllMembers() : ElementDecorator.decorate(delegate.getAllMembers(type), this.env);
}
@Override
public List<? extends AnnotationMirror> getAllAnnotationMirrors(Element e) {
while (e instanceof DecoratedElement) {
e = ((DecoratedElement) e).getDelegate();
}
return e instanceof ElementAdaptor ? ((ElementAdaptor)e).getAllAnnotationMirrors() : ElementDecorator.decorateAnnotationMirrors(delegate.getAllAnnotationMirrors(e), this.env);
}
@Override
public boolean hides(Element hider, Element hidden) {
while (hider instanceof DecoratedElement) {
hider = ((DecoratedElement) hider).getDelegate();
}
while (hidden instanceof DecoratedElement) {
hidden = ((DecoratedElement) hidden).getDelegate();
}
if (hider instanceof ElementAdaptor) {
return ((ElementAdaptor)hider).hides(hidden);
}
if (hidden instanceof ElementAdaptor) {
return ((ElementAdaptor)hidden).isHiddenBy(hider);
}
return delegate.hides(hider, hidden);
}
@Override
public boolean overrides(ExecutableElement overrider, ExecutableElement overridden, TypeElement type) {
while (overrider instanceof DecoratedExecutableElement) {
overrider = ((DecoratedExecutableElement) overrider).getDelegate();
}
if (overrider instanceof ExecutableElementAdaptor) {
return ((ExecutableElementAdaptor)overrider).overrides(overridden, type);
}
while (overridden instanceof DecoratedExecutableElement) {
overridden = ((DecoratedExecutableElement) overridden).getDelegate();
}
if (overridden instanceof ExecutableElementAdaptor) {
return ((ExecutableElementAdaptor)overridden).isOverriddenBy(overrider, type);
}
while (type instanceof DecoratedTypeElement) {
type = ((DecoratedTypeElement) type).getDelegate();
}
if (type instanceof TypeElementAdaptor) {
return ((TypeElementAdaptor)type).overrides(overrider, overridden);
}
return delegate.overrides(overrider, overridden, type);
}
@Override
public String getConstantExpression(Object value) {
return delegate.getConstantExpression(value);
}
@Override
public void printElements(Writer w, Element... elements) {
Element[] copy = new Element[elements.length];
for (int i = 0; i < elements.length; i++) {
Element e = elements[i];
while (e instanceof DecoratedElement) {
e = ((DecoratedElement) e).getDelegate();
}
copy[i] = e;
}
delegate.printElements(w, copy);
}
@Override
public Name getName(CharSequence cs) {
return delegate.getName(cs);
}
}