blob: ede05da9e4161555db86cde0476c67f92466a45c [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.JArrayType;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JField;
import com.google.gwt.core.ext.typeinfo.JGenericType;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.core.ext.typeinfo.JTypeParameter;
/**
* Paths of types and utility methods for creating them. These are used by
* {@link SerializableTypeOracleBuilder} to record why it visits the types it
* does.
*/
class TypePaths {
/**
* A path of types. This interface does not currently expose the type itself,
* because these are currently only used for logging.
*/
interface TypePath {
/**
* Get the previous element on this type path, or <code>null</code> if
* this is a one-element path.
*/
TypePath getParent();
String toString();
}
static TypePaths.TypePath createArrayComponentPath(
final JArrayType arrayType, final TypePaths.TypePath parent) {
assert (arrayType != null);
return new TypePaths.TypePath() {
public TypePaths.TypePath getParent() {
return parent;
}
@Override
public String toString() {
return "Type '"
+ arrayType.getComponentType().getParameterizedQualifiedSourceName()
+ "' is reachable from array type '"
+ arrayType.getParameterizedQualifiedSourceName() + "'";
}
};
}
static TypePaths.TypePath createFieldPath(final TypePaths.TypePath parent,
final JField field) {
return new TypePaths.TypePath() {
public TypePaths.TypePath getParent() {
return parent;
}
@Override
public String toString() {
JType type = field.getType();
JClassType enclosingType = field.getEnclosingType();
return "'" + type.getParameterizedQualifiedSourceName()
+ "' is reachable from field '" + field.getName() + "' of type '"
+ enclosingType.getParameterizedQualifiedSourceName() + "'";
}
};
}
static TypePaths.TypePath createRootPath(final JType type) {
assert (type != null);
return new TypePaths.TypePath() {
public TypePaths.TypePath getParent() {
return null;
}
@Override
public String toString() {
return "Started from '" + type.getParameterizedQualifiedSourceName()
+ "'";
}
};
}
static TypePaths.TypePath createSubtypePath(final TypePaths.TypePath parent,
final JType type, final JClassType supertype) {
assert (type != null);
assert (supertype != null);
return new TypePaths.TypePath() {
public TypePaths.TypePath getParent() {
return parent;
}
@Override
public String toString() {
return "'" + type.getParameterizedQualifiedSourceName()
+ "' is reachable as a subtype of type '" + supertype + "'";
}
};
}
static TypePaths.TypePath createSupertypePath(
final TypePaths.TypePath parent, final JType type,
final JClassType subtype) {
assert (type != null);
assert (subtype != null);
return new TypePaths.TypePath() {
public TypePaths.TypePath getParent() {
return parent;
}
@Override
public String toString() {
return "'" + type.getParameterizedQualifiedSourceName()
+ "' is reachable as a supertype of type '" + subtype + "'";
}
};
}
static TypePaths.TypePath createTypeArgumentPath(
final TypePaths.TypePath parent, final JGenericType baseType,
final int typeArgIndex, final JClassType typeArg) {
assert (baseType != null);
assert (typeArg != null);
return new TypePaths.TypePath() {
public TypePaths.TypePath getParent() {
return parent;
}
@Override
public String toString() {
return "'" + typeArg.getParameterizedQualifiedSourceName()
+ "' is reachable from type argument " + typeArgIndex
+ " of type '" + baseType.getParameterizedQualifiedSourceName()
+ "'";
}
};
}
static TypePaths.TypePath createTypeParameterInRootPath(
final TypePaths.TypePath parent, final JTypeParameter typeParameter) {
assert (typeParameter != null);
return new TypePaths.TypePath() {
public TypePaths.TypePath getParent() {
return parent;
}
@Override
public String toString() {
String parameterString = typeParameter.getName();
if (typeParameter.getDeclaringClass() != null) {
parameterString += " of class "
+ typeParameter.getDeclaringClass().getQualifiedSourceName();
}
return "'"
+ typeParameter.getFirstBound().getParameterizedQualifiedSourceName()
+ "' is reachable as an upper bound of type parameter "
+ parameterString + ", which appears in a root type";
}
};
}
}