blob: 5d746e3aad750b407b32811affca3bbe0f5d8dbd [file] [log] [blame]
/*
* 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.user.rebind.rpc;
import com.google.gwt.core.ext.typeinfo.JAnnotationType;
import com.google.gwt.core.ext.typeinfo.JArrayType;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JEnumType;
import com.google.gwt.core.ext.typeinfo.JGenericType;
import com.google.gwt.core.ext.typeinfo.JParameterizedType;
import com.google.gwt.core.ext.typeinfo.JPrimitiveType;
import com.google.gwt.core.ext.typeinfo.JRawType;
import com.google.gwt.core.ext.typeinfo.JRealClassType;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.core.ext.typeinfo.JTypeParameter;
import com.google.gwt.core.ext.typeinfo.JWildcardType;
/**
* A visitor that traverses the structure of a {@link JType}.
*/
class JTypeVisitor {
/**
* Accept <code>type</code>, traverse its children with
* {@link #acceptChildren(JType)}, and then call {@link #endVisit(JType)} on
* <code>type</code> itself.
*/
public void accept(JType type) {
acceptChildren(type);
endVisit(type);
}
/**
* Call {@link #accept(JType)} on all children types of <code>type</code>.
* The children type of a type are its structural components. For example, an
* array type has one child, which is the component type of the array.
*/
protected void acceptChildren(JType type) {
JArrayType typeArray = type.isArray();
if (typeArray != null) {
accept(typeArray.getComponentType());
endVisit(typeArray);
}
JParameterizedType typeParameterized = type.isParameterized();
if (typeParameterized != null) {
accept(typeParameterized.getBaseType());
for (JClassType typeArg : typeParameterized.getTypeArgs()) {
accept(typeArg);
}
endVisit(typeParameterized);
}
JRawType typeRaw = type.isRawType();
if (typeRaw != null) {
accept(typeRaw.getBaseType());
endVisit(typeRaw);
}
JWildcardType typeWild = type.isWildcard();
if (typeWild != null) {
accept(typeWild.getFirstBound());
endVisit(typeWild);
}
}
/**
* @param typeAnnotation
*/
protected void endVisit(JAnnotationType typeAnnotation) {
}
/**
* @param typeArray
*/
protected void endVisit(JArrayType typeArray) {
}
/**
* @param typeEnum
*/
protected void endVisit(JEnumType typeEnum) {
}
/**
* @param typeGeneric
*/
protected void endVisit(JGenericType typeGeneric) {
}
/**
* @param typeParameterized
*/
protected void endVisit(JParameterizedType typeParameterized) {
}
/**
* @param typePrimitive
*/
protected void endVisit(JPrimitiveType typePrimitive) {
}
/**
* @param typeRaw
*/
protected void endVisit(JRawType typeRaw) {
}
/**
* @param typeReal
*/
protected void endVisit(JRealClassType typeReal) {
}
/**
* This endVisit is called on all visited types. By default it dispatches to
* one of the more specific endVisit methods, e.g.
* {@link #endVisit(JArrayType)}.
*/
protected void endVisit(JType type) {
JAnnotationType typeAnnotation = type.isAnnotation();
if (typeAnnotation != null) {
endVisit(typeAnnotation);
return;
}
JArrayType typeArray = type.isArray();
if (typeArray != null) {
endVisit(typeArray);
return;
}
JEnumType typeEnum = type.isEnum();
if (typeEnum != null) {
endVisit(typeEnum);
return;
}
JGenericType typeGeneric = type.isGenericType();
if (typeGeneric != null) {
endVisit(typeGeneric);
return;
}
JParameterizedType typeParameterized = type.isParameterized();
if (typeParameterized != null) {
endVisit(typeParameterized);
return;
}
JPrimitiveType typePrimitive = type.isPrimitive();
if (typePrimitive != null) {
endVisit(typePrimitive);
return;
}
JRawType typeRaw = type.isRawType();
if (typeRaw != null) {
endVisit(typeRaw);
return;
}
JTypeParameter typeParam = type.isTypeParameter();
if (typeParam != null) {
endVisit(typeParam);
return;
}
JWildcardType typeWild = type.isWildcard();
if (typeWild != null) {
endVisit(typeWild);
return;
}
JRealClassType typeReal = (JRealClassType) type;
endVisit(typeReal);
}
/**
* @param typeParam
*/
protected void endVisit(JTypeParameter typeParam) {
}
/**
* @param typeWild
*/
protected void endVisit(JWildcardType typeWild) {
}
}