| /* |
| * 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; |
| } |
| } |
| } |