blob: a121a2449bcf7e1e7bf9c3be4cc6942739496271 [file] [log] [blame]
/*
* Copyright 2006 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.util;
import java.lang.reflect.Method;
/**
* Java type helpers used.
*/
public class TypeInfo {
public static final int NOT_FOUND = 0; // used with all of the enumerated
public static final int TYPE_ARRAY = 0x200000;
public static final int TYPE_COLLECTION = 0x180000;
public static final int TYPE_COLLECTION_LIST = 0x100000;
public static final int TYPE_COLLECTION_SET = 0x080000;
public static final int TYPE_PRIM = 0x07fc00;
public static final int TYPE_PRIM_BOOLEAN = 0x008000;
public static final int TYPE_PRIM_BYTE = 0x000800;
public static final int TYPE_PRIM_CHAR = 0x000400;
public static final int TYPE_PRIM_DOUBLE = 0x020000;
public static final int TYPE_PRIM_FLOAT = 0x010000;
public static final int TYPE_PRIM_INT = 0x002000;
public static final int TYPE_PRIM_LONG = 0x004000;
public static final int TYPE_PRIM_SHORT = 0x001000;
public static final int TYPE_PRIM_VOID = 0x040000;
public static final int TYPE_USER = 0x400000;
public static final int TYPE_WRAP = 0x0003ff;
public static final int TYPE_WRAP_BOOLEAN = 0x000040;
public static final int TYPE_WRAP_BYTE = 0x000004;
public static final int TYPE_WRAP_CHAR = 0x000002;
public static final int TYPE_WRAP_DATE = 0x000200;
public static final int TYPE_WRAP_DOUBLE = 0x000100;
public static final int TYPE_WRAP_FLOAT = 0x000080;
public static final int TYPE_WRAP_INT = 0x000010;
public static final int TYPE_WRAP_LONG = 0x000020;
public static final int TYPE_WRAP_SHORT = 0x000008;
// types below
public static final int TYPE_WRAP_STRING = 0x000001;
public static int classifyType(Class<?> type) {
int ret = isPrimitiveType(type);
if (ret != 0) {
return ret;
}
ret = isPrimitiveWrapperType(type);
if (ret != 0) {
return ret;
}
if (type.isArray()) {
return TYPE_ARRAY;
}
return TYPE_USER;
}
public static Method getInterfaceMethod(Class<?> intf, String methodName,
Class<?>[] paramTypes, boolean includeInherited) {
try {
return intf.getDeclaredMethod(methodName, paramTypes);
} catch (NoSuchMethodException e) {
if (includeInherited) {
Class<?>[] superintfs = intf.getInterfaces();
for (int i = 0; i < superintfs.length; i++) {
Method method = getInterfaceMethod(superintfs[i], methodName,
paramTypes, true);
if (method != null) {
return method;
}
}
}
return null;
}
}
public static String getJavahMangledIdent(String before) {
StringBuffer after = new StringBuffer();
char[] chars = before.toCharArray();
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
if (c == '_') {
after.append("_1");
} else if (c == ';') {
after.append("_2");
} else if (c == '[') {
after.append("_3");
} else if (c == '/') {
after.append('_');
} else if (Character.isJavaIdentifierPart(c)) {
after.append(c);
} else {
throw new UnsupportedOperationException("Cannot handle non-ascii yet");
}
}
return after.toString();
}
public static String getSourceRepresentation(Class<?> type) {
// Primitives
//
if (type.equals(Integer.TYPE)) {
return "int";
} else if (type.equals(Long.TYPE)) {
return "long";
} else if (type.equals(Short.TYPE)) {
return "short";
} else if (type.equals(Byte.TYPE)) {
return "byte";
} else if (type.equals(Character.TYPE)) {
return "char";
} else if (type.equals(Boolean.TYPE)) {
return "boolean";
} else if (type.equals(Float.TYPE)) {
return "float";
} else if (type.equals(Double.TYPE)) {
return "double";
}
// Arrays
//
if (type.isArray()) {
Class<?> componentType = type.getComponentType();
return getSourceRepresentation(componentType) + "[]";
}
// Everything else
//
return type.getName().replace('$', '.');
}
public static int isPrimitiveType(Class<?> type) {
if (type.equals(Integer.TYPE)) {
return TYPE_PRIM_INT;
} else if (type.equals(Long.TYPE)) {
return TYPE_PRIM_LONG;
} else if (type.equals(Character.TYPE)) {
return TYPE_PRIM_CHAR;
} else if (type.equals(Byte.TYPE)) {
return TYPE_PRIM_BYTE;
} else if (type.equals(Short.TYPE)) {
return TYPE_PRIM_SHORT;
} else if (type.equals(Boolean.TYPE)) {
return TYPE_PRIM_BOOLEAN;
} else if (type.equals(Float.TYPE)) {
return TYPE_PRIM_FLOAT;
} else if (type.equals(Double.TYPE)) {
return TYPE_PRIM_DOUBLE;
} else if (type.equals(Void.TYPE)) {
return TYPE_PRIM_VOID;
} else {
return NOT_FOUND;
}
}
public static int isPrimitiveWrapperType(Class<?> type) {
if (type.equals(String.class)) {
return TYPE_WRAP_STRING;
} else if (type.equals(Integer.class)) {
return TYPE_WRAP_INT;
} else if (type.equals(Long.class)) {
return TYPE_WRAP_LONG;
} else if (type.equals(Character.class)) {
return TYPE_WRAP_CHAR;
} else if (type.equals(Byte.class)) {
return TYPE_WRAP_BYTE;
} else if (type.equals(Short.class)) {
return TYPE_WRAP_SHORT;
} else if (type.equals(Boolean.class)) {
return TYPE_WRAP_BOOLEAN;
} else if (type.equals(Float.class)) {
return TYPE_WRAP_FLOAT;
} else if (type.equals(Double.class)) {
return TYPE_WRAP_DOUBLE;
} else {
return NOT_FOUND;
}
}
}