/* * Copyright 2015 Lukas Krejci * * 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 org.revapi.java.compilation; import java.io.Writer; import java.util.Collections; import java.util.List; import java.util.Map; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Name; import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import javax.lang.model.util.Elements; import org.revapi.java.model.MissingTypeElement; import org.revapi.java.spi.IgnoreCompletionFailures; /** * @author Lukas Krejci * @since 0.1 */ final class MissingTypeAwareDelegatingElements implements Elements { private final Elements elements; MissingTypeAwareDelegatingElements(Elements elements) { this.elements = elements; } @Override public PackageElement getPackageElement(CharSequence name) { return IgnoreCompletionFailures.in(elements::getPackageElement, name); } @Override public TypeElement getTypeElement(CharSequence name) { return IgnoreCompletionFailures.in(elements::getTypeElement, name); } @Override public Map<? extends ExecutableElement, ? extends AnnotationValue> getElementValuesWithDefaults( AnnotationMirror a) { return IgnoreCompletionFailures.in(elements::getElementValuesWithDefaults, a); } @Override public String getDocComment(Element e) { if (MissingTypeElement.isMissing(e)) { return ""; } return IgnoreCompletionFailures.in(elements::getDocComment, e); } @Override public boolean isDeprecated(Element e) { if (MissingTypeElement.isMissing(e)) { return false; } return IgnoreCompletionFailures.in(elements::isDeprecated, e); } @Override public Name getBinaryName(TypeElement type) { if (MissingTypeElement.isMissing(type)) { return type.getQualifiedName(); } return IgnoreCompletionFailures.in(elements::getBinaryName, type); } @Override public PackageElement getPackageOf(Element type) { if (MissingTypeElement.isMissing(type)) { String binaryName = ((MissingTypeElement) type).getQualifiedName().toString(); int lastDot = binaryName.lastIndexOf('.'); return elements.getPackageElement(binaryName.substring(0, lastDot)); } return IgnoreCompletionFailures.in(elements::getPackageOf, type); } @Override public List<? extends Element> getAllMembers( TypeElement type) { if (MissingTypeElement.isMissing(type)) { return Collections.emptyList(); } return IgnoreCompletionFailures.in(elements::getAllMembers, type); } @Override public List<? extends AnnotationMirror> getAllAnnotationMirrors( Element e) { if (MissingTypeElement.isMissing(e)) { return Collections.emptyList(); } return IgnoreCompletionFailures.in(elements::getAllAnnotationMirrors, e); } @Override public boolean hides(Element hider, Element hidden) { if (MissingTypeElement.isMissing(hider) || MissingTypeElement.isMissing(hidden)) { return false; } return IgnoreCompletionFailures.in(elements::hides, hider, hidden); } @Override public boolean overrides(ExecutableElement overrider, ExecutableElement overridden, TypeElement type) { if (MissingTypeElement.isMissing(type)) { return false; } return IgnoreCompletionFailures.in(elements::overrides, overrider, overridden, type); } @Override public String getConstantExpression(Object value) { return IgnoreCompletionFailures.in(elements::getConstantExpression, value); } @Override public void printElements(Writer w, Element... elems) { IgnoreCompletionFailures.inVoid(elements::printElements, w, elems); } @Override public boolean isFunctionalInterface(TypeElement type) { return elements.isFunctionalInterface(type); } @Override public Name getName(CharSequence cs) { try { return elements.getName(cs); } catch (Exception ex) { throw new IllegalStateException(ex); } } }