/*
 * 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());
  }
}
