/* * Copyright 2011 Google Inc. * * 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.google.web.bindery.requestfactory.apt; import java.util.List; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; /** * Looks for {@code ExtraTypes} annotations and calls * {@link #scanExtraType(TypeElement)}. */ abstract class ExtraTypesScanner<T> extends ScannerBase<T> { /** * Check an element for a declaration. */ protected void checkForAnnotation(Element x, State state) { // Bug similar to Eclipse 261969 makes ExtraTypes.value() unreliable. for (AnnotationMirror mirror : x.getAnnotationMirrors()) { if (!state.types.isSameType(mirror.getAnnotationType(), state.extraTypesAnnotation)) { continue; } // The return of the Class[] value() method AnnotationValue value = mirror.getElementValues().values().iterator().next(); // which is represented by a list @SuppressWarnings("unchecked") List<? extends AnnotationValue> valueList = (List<? extends AnnotationValue>) value.getValue(); for (AnnotationValue clazz : valueList) { TypeMirror type = (TypeMirror) clazz.getValue(); scanExtraType((TypeElement) state.types.asElement(type)); } } } /** * Check a type and all of its supertypes for the annotation. */ protected void checkForAnnotation(TypeElement x, State state) { // Check type's declaration checkForAnnotation((Element) x, state); // Look at superclass, if it exists if (!x.getSuperclass().getKind().equals(TypeKind.NONE)) { checkForAnnotation((TypeElement) state.types.asElement(x.getSuperclass()), state); } // Check super-interfaces for (TypeMirror intf : x.getInterfaces()) { checkForAnnotation((TypeElement) state.types.asElement(intf), state); } } protected abstract void scanExtraType(TypeElement extraType); }