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