| /* |
| * Copyright 2008 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.gwt.dev.javac.typemodel; |
| |
| import com.google.gwt.core.ext.typeinfo.JPrimitiveType; |
| import com.google.gwt.core.ext.typeinfo.JType; |
| import com.google.gwt.core.ext.typeinfo.NotFoundException; |
| |
| import java.lang.annotation.Annotation; |
| import java.util.Map; |
| |
| /** |
| * Base class for types that delegate to another type, such as a JTypeParameter |
| * or JParameterizedType. |
| */ |
| abstract class JDelegatingClassType extends JClassType { |
| |
| private JClassType baseType; |
| |
| JDelegatingClassType() { |
| } |
| |
| /** |
| * Delegating types generally cannot be constructed. |
| */ |
| @Override |
| public JConstructor findConstructor(JType[] paramTypes) { |
| return null; |
| } |
| |
| /** |
| * Subclasses will generally need to echo modified fields. |
| */ |
| @Override |
| public abstract JField findField(String name); |
| |
| /** |
| * Subclasses will generally need to echo modified methods. |
| */ |
| @Override |
| public abstract JMethod findMethod(String name, JType[] paramTypes); |
| |
| @Override |
| public JClassType findNestedType(String typeName) { |
| return baseType.findNestedType(typeName); |
| } |
| |
| @Override |
| public <T extends Annotation> T getAnnotation(Class<T> annotationClass) { |
| return baseType.getAnnotation(annotationClass); |
| } |
| |
| @Override |
| public Annotation[] getAnnotations() { |
| return baseType.getAnnotations(); |
| } |
| |
| public JClassType getBaseType() { |
| return baseType; |
| } |
| |
| /** |
| * Delegating types generally cannot be constructed. |
| */ |
| @Override |
| public JConstructor getConstructor(JType[] paramTypes) |
| throws NotFoundException { |
| throw new NotFoundException(); |
| } |
| |
| /** |
| * Delegating types generally cannot be constructed. |
| */ |
| @Override |
| public JConstructor[] getConstructors() { |
| return TypeOracle.NO_JCTORS; |
| } |
| |
| @Override |
| public Annotation[] getDeclaredAnnotations() { |
| return baseType.getDeclaredAnnotations(); |
| } |
| |
| @Override |
| public JClassType getEnclosingType() { |
| // TODO this can be wrong if the enclosing type is a parameterized type. For |
| // example, if a generic class has a non-static generic inner class. |
| return baseType.getEnclosingType(); |
| } |
| |
| @Override |
| public JClassType getErasedType() { |
| return baseType.getErasedType(); |
| } |
| |
| /** |
| * Subclasses will generally need to echo modified fields. |
| */ |
| @Override |
| public abstract JField getField(String name); |
| |
| /** |
| * Subclasses will generally need to echo modified fields. |
| */ |
| @Override |
| public abstract JField[] getFields(); |
| |
| @Override |
| public JClassType[] getImplementedInterfaces() { |
| return baseType.getImplementedInterfaces(); |
| } |
| |
| @Override |
| public JMethod[] getInheritableMethods() { |
| return baseType.getInheritableMethods(); |
| } |
| |
| @Override |
| public String getJNISignature() { |
| return baseType.getJNISignature(); |
| } |
| |
| /** |
| * Subclasses will generally need to echo modified methods. |
| */ |
| @Override |
| public abstract JMethod getMethod(String name, JType[] paramTypes) |
| throws NotFoundException; |
| |
| /** |
| * Subclasses will generally need to echo modified methods. |
| */ |
| @Override |
| public abstract JMethod[] getMethods(); |
| |
| @Override |
| public String getName() { |
| return baseType.getName(); |
| } |
| |
| @Override |
| public JClassType getNestedType(String typeName) throws NotFoundException { |
| return baseType.getNestedType(typeName); |
| } |
| |
| @Override |
| public JClassType[] getNestedTypes() { |
| return baseType.getNestedTypes(); |
| } |
| |
| @Override |
| public TypeOracle getOracle() { |
| return baseType.getOracle(); |
| } |
| |
| @Override |
| public JMethod[] getOverloads(String name) { |
| return baseType.getOverloads(name); |
| } |
| |
| @Override |
| public JMethod[] getOverridableMethods() { |
| return baseType.getOverridableMethods(); |
| } |
| |
| @Override |
| public JPackage getPackage() { |
| return baseType.getPackage(); |
| } |
| |
| @Override |
| public JClassType[] getSubtypes() { |
| return baseType.getSubtypes(); |
| } |
| |
| @Override |
| public JClassType getSuperclass() { |
| return baseType.getSuperclass(); |
| } |
| |
| @Override |
| public boolean isAbstract() { |
| return baseType.isAbstract(); |
| } |
| |
| @Override |
| public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) { |
| return baseType.isAnnotationPresent(annotationClass); |
| } |
| |
| @Override |
| public final JArrayType isArray() { |
| return null; |
| } |
| |
| @Override |
| public JClassType isClass() { |
| if (baseType.isClass() != null) { |
| return this; |
| } else { |
| return null; |
| } |
| } |
| |
| @Override |
| public JClassType isClassOrInterface() { |
| if (baseType.isClassOrInterface() != null) { |
| return this; |
| } else { |
| return null; |
| } |
| } |
| |
| @Override |
| public boolean isDefaultInstantiable() { |
| return baseType.isDefaultInstantiable(); |
| } |
| |
| @Override |
| public final JEnumType isEnum() { |
| return null; |
| } |
| |
| @Override |
| public boolean isFinal() { |
| return baseType.isFinal(); |
| } |
| |
| @Override |
| public JClassType isInterface() { |
| if (baseType.isInterface() != null) { |
| return this; |
| } else { |
| return null; |
| } |
| } |
| |
| @Override |
| public boolean isMemberType() { |
| return baseType.isMemberType(); |
| } |
| |
| @Override |
| public final JPrimitiveType isPrimitive() { |
| return null; |
| } |
| |
| @Override |
| public boolean isPrivate() { |
| return baseType.isPrivate(); |
| } |
| |
| @Override |
| public boolean isProtected() { |
| return baseType.isProtected(); |
| } |
| |
| @Override |
| public boolean isPublic() { |
| return baseType.isPublic(); |
| } |
| |
| @Override |
| public boolean isStatic() { |
| return baseType.isStatic(); |
| } |
| |
| @Override |
| public String toString() { |
| if (baseType.isInterface() != null) { |
| return "interface " + getQualifiedSourceName(); |
| } else { |
| return "class " + getQualifiedSourceName(); |
| } |
| } |
| |
| @Override |
| protected void acceptSubtype(JClassType me) { |
| baseType.acceptSubtype(me); |
| } |
| |
| @Override |
| protected void getInheritableMethodsOnSuperclassesAndThisClass( |
| Map<String, JMethod> methodsBySignature) { |
| baseType.getInheritableMethodsOnSuperclassesAndThisClass(methodsBySignature); |
| } |
| |
| @Override |
| protected void getInheritableMethodsOnSuperinterfacesAndMaybeThisInterface( |
| Map<String, JMethod> methodsBySignature) { |
| baseType.getInheritableMethodsOnSuperinterfacesAndMaybeThisInterface(methodsBySignature); |
| } |
| |
| @Override |
| protected int getModifierBits() { |
| return baseType.getModifierBits(); |
| } |
| |
| @Override |
| protected void notifySuperTypesOf(JClassType me) { |
| } |
| |
| @Override |
| protected void removeSubtype(JClassType me) { |
| } |
| |
| @Override |
| final void addConstructor(JConstructor ctor) { |
| throw new UnsupportedOperationException("modifying a " |
| + getClass().getSimpleName()); |
| } |
| |
| @Override |
| final void addField(JField field) { |
| throw new UnsupportedOperationException("modifying a " |
| + getClass().getSimpleName()); |
| } |
| |
| @Override |
| final void addImplementedInterface(JClassType intf) { |
| throw new UnsupportedOperationException("modifying a " |
| + getClass().getSimpleName()); |
| } |
| |
| @Override |
| final void addMethod(JMethod method) { |
| throw new UnsupportedOperationException("modifying a " |
| + getClass().getSimpleName()); |
| } |
| |
| @Override |
| final void addModifierBits(int bits) { |
| throw new UnsupportedOperationException("modifying a " |
| + getClass().getSimpleName()); |
| } |
| |
| @Override |
| final void addNestedType(JClassType type) { |
| throw new UnsupportedOperationException("modifying a " |
| + getClass().getSimpleName()); |
| } |
| |
| @Override |
| JClassType findNestedTypeImpl(String[] typeName, int index) { |
| return baseType.findNestedTypeImpl(typeName, index); |
| } |
| |
| @Override |
| void notifySuperTypes() { |
| } |
| |
| @Override |
| void removeFromSupertypes() { |
| } |
| |
| final void setBaseType(JClassType baseType) { |
| this.baseType = baseType; |
| } |
| |
| @Override |
| void setSuperclass(JClassType type) { |
| throw new UnsupportedOperationException("modifying a " |
| + getClass().getSimpleName()); |
| } |
| } |