blob: 241a1c5463b51ed60c5930a08f8ea3f24ea4e266 [file] [log] [blame]
/*
* Copyright 2010 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.editor.rebind.model;
import com.google.web.bindery.autobean.shared.ValueCodex;
import com.google.gwt.core.ext.typeinfo.JArrayType;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JParameterizedType;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
/**
* Utility class for common model methods.
*/
public class ModelUtils {
static final Set<String> VALUE_TYPE_NAMES;
static {
Set<Class<?>> valueTypes = ValueCodex.getAllValueTypes();
Set<String> names = new HashSet<String>(valueTypes.size());
for (Class<?> clazz : valueTypes) {
names.add(clazz.getName());
}
VALUE_TYPE_NAMES = Collections.unmodifiableSet(names);
}
@SuppressWarnings("unchecked")
public static <T extends JType> T ensureBaseType(T maybeParameterized) {
if (maybeParameterized.isArray() != null) {
JArrayType array = maybeParameterized.isArray();
return (T) array.getOracle().getArrayType(
ensureBaseType(array.getComponentType()));
}
if (maybeParameterized.isTypeParameter() != null) {
return (T) maybeParameterized.isTypeParameter().getBaseType();
}
if (maybeParameterized.isParameterized() != null) {
return (T) maybeParameterized.isParameterized().getBaseType();
}
if (maybeParameterized.isRawType() != null) {
return (T) maybeParameterized.isRawType().getBaseType();
}
if (maybeParameterized.isWildcard() != null) {
return (T) maybeParameterized.isWildcard().getBaseType();
}
return maybeParameterized;
}
public static JClassType[] findParameterizationOf(JClassType intfType,
JClassType subType) {
assert intfType.isAssignableFrom(subType) : subType.getParameterizedQualifiedSourceName()
+ " is not assignable to "
+ subType.getParameterizedQualifiedSourceName();
for (JClassType supertype : subType.getFlattenedSupertypeHierarchy()) {
JParameterizedType parameterized = supertype.isParameterized();
if (parameterized != null) {
// Found the desired supertype
if (intfType.equals(parameterized.getBaseType())) {
return parameterized.getTypeArgs();
}
}
}
return null;
}
/**
* Given a JType, return the binary name of the class that is most proximately
* assignable to the type. This method will resolve type parameters as well as
* wildcard types.
*/
public static String getQualifiedBaseBinaryName(JType type) {
return ensureBaseType(type).getErasedType().getQualifiedBinaryName();
}
/**
* Given a JType, return the source name of the class that is most proximately
* assignable to the type. This method will resolve type parameters as well as
* wildcard types.
*/
public static String getQualifiedBaseSourceName(JType type) {
return ensureBaseType(type).getErasedType().getQualifiedSourceName();
}
public static boolean isValueType(TypeOracle oracle, JType type) {
JClassType classType = type.isClassOrInterface();
if (classType == null) {
return true;
}
if (type.isEnum() != null) {
return true;
}
for (String valueType : VALUE_TYPE_NAMES) {
JClassType found = oracle.findType(valueType);
// null check to accommodate limited mock CompilationStates
if (found != null && found.equals(classType)) {
return true;
}
}
return false;
}
private ModelUtils() {
}
}