View Javadoc

1   /*
2    * ClassHelper.java created on 25.10.2005
3    *
4    */
5   package org.codehaus.groovy.ast;
6   
7   import groovy.lang.Closure;
8   import groovy.lang.GString;
9   import groovy.lang.Range;
10  import groovy.lang.Reference;
11  import groovy.lang.Script;
12  
13  import java.math.BigDecimal;
14  import java.math.BigInteger;
15  import java.util.List;
16  import java.util.Map;
17  import java.util.regex.Pattern;
18  
19  import org.objectweb.asm.Opcodes;
20  
21  /***
22   * @author Jochen Theodorou
23   */
24  public class ClassHelper {
25      
26  
27      private static String[] names = new String[] {
28          boolean.class.getName(),    char.class.getName(), 
29          byte.class.getName(),       short.class.getName(),
30          int.class.getName(),        long.class.getName(),
31          double.class.getName(),     float.class.getName(),
32          Object.class.getName(),     Void.TYPE.getName(),
33          Closure.class.getName(),    GString.class.getName(),
34          List.class.getName(),       Map.class.getName(),
35          Range.class.getName(),      Pattern.class.getName(),
36          Script.class.getName(),     String.class.getName(),
37          Boolean.class.getName(),    Character.class.getName(),
38          Byte.class.getName(),       Short.class.getName(),
39          Integer.class.getName(),    Long.class.getName(),
40          Double.class.getName(),     Float.class.getName(),
41          BigDecimal.class.getName(), BigInteger.class.getName(),
42          Void.class.getName()
43      };
44      
45      private static Class[] classes = new Class[] {
46          Object.class, Boolean.TYPE, Character.TYPE, Byte.TYPE, Short.TYPE,
47          Integer.TYPE, Long.TYPE, Double.TYPE, Float.TYPE, Void.TYPE,
48          Closure.class, GString.class, List.class, Map.class, Range.class,
49          Pattern.class, Script.class, String.class,  Boolean.class, 
50          Character.class, Byte.class, Short.class, Integer.class, Long.class,
51          Double.class, Float.class, BigDecimal.class, BigInteger.class, Void.class
52      };
53      
54      public static final ClassNode 
55          DYNAMIC_TYPE = new ClassNode(Object.class),  OBJECT_TYPE = DYNAMIC_TYPE,
56          VOID_TYPE = new ClassNode(Void.TYPE),        CLOSURE_TYPE = new ClassNode(Closure.class),
57          GSTRING_TYPE = new ClassNode(GString.class), LIST_TYPE = new ClassNode(List.class),
58          MAP_TYPE = new ClassNode(Map.class),         RANGE_TYPE = new ClassNode(Range.class),
59          PATTERN_TYPE = new ClassNode(Pattern.class), STRING_TYPE = new ClassNode(String.class),
60          SCRIPT_TYPE = new ClassNode(Script.class),
61          
62          boolean_TYPE = new ClassNode(boolean.class),     char_TYPE = new ClassNode(char.class),
63          byte_TYPE = new ClassNode(byte.class),           int_TYPE = new ClassNode(int.class),
64          long_TYPE = new ClassNode(long.class),           short_TYPE = new ClassNode(short.class),
65          double_TYPE = new ClassNode(double.class),       float_TYPE = new ClassNode(float.class),
66          Byte_TYPE = new ClassNode(Byte.class),           Short_TYPE = new ClassNode(Short.class),
67          Integer_TYPE = new ClassNode(Integer.class),     Long_TYPE = new ClassNode(Long.class),
68          Character_TYPE = new ClassNode(Character.class), Float_TYPE = new ClassNode(Float.class),
69          Double_TYPE = new ClassNode(Double.class),       Boolean_TYPE = new ClassNode(Boolean.class),
70          BigInteger_TYPE =  new ClassNode(java.math.BigInteger.class),
71          BigDecimal_TYPE = new ClassNode(java.math.BigDecimal.class),
72          void_WRAPPER_TYPE = new ClassNode(Void.class);
73      
74      private static ClassNode[] types = new ClassNode[] {
75          OBJECT_TYPE,
76          boolean_TYPE, char_TYPE, byte_TYPE, short_TYPE,
77          int_TYPE, long_TYPE, double_TYPE, float_TYPE,
78          VOID_TYPE, CLOSURE_TYPE, GSTRING_TYPE,
79          LIST_TYPE, MAP_TYPE, RANGE_TYPE, PATTERN_TYPE,
80          SCRIPT_TYPE, STRING_TYPE, Boolean_TYPE, Character_TYPE,
81          Byte_TYPE, Short_TYPE, Integer_TYPE, Long_TYPE,
82          Double_TYPE, Float_TYPE, BigDecimal_TYPE, BigInteger_TYPE, void_WRAPPER_TYPE
83      };
84  
85      
86      private static ClassNode[] numbers = new ClassNode[] {
87          char_TYPE, byte_TYPE, short_TYPE, int_TYPE, long_TYPE, 
88          double_TYPE, float_TYPE, Short_TYPE, Byte_TYPE, Character_TYPE,
89          Integer_TYPE, Float_TYPE, Long_TYPE, Double_TYPE, BigInteger_TYPE,
90          BigDecimal_TYPE
91      };
92  
93      protected static final ClassNode[] EMPTY_TYPE_ARRAY = {};
94      
95      public static final String OBJECT = "java.lang.Object";    
96      
97      public static ClassNode make(Class c) {
98          for (int i=0; i<classes.length; i++) {
99              if (c==classes[i]) return types[i];
100         }
101         if (c.isArray()) {
102             ClassNode cn = make(c.getComponentType());
103             return cn.makeArray();
104         }
105         ClassNode t = new ClassNode(c);
106         return t;
107     }
108     
109     public static ClassNode makeWithoutCaching(String name) { 
110         ClassNode cn = new ClassNode(name,Opcodes.ACC_PUBLIC,OBJECT_TYPE);
111         cn.resolved = false;
112         cn.isPrimaryNode = false;
113         return cn;
114     }
115     
116     public static ClassNode make(String name) {
117         if (name == null || name.length() == 0) return DYNAMIC_TYPE;
118         
119         for (int i=0; i<classes.length; i++) {
120             String cname = classes[i].getName();
121             if (name.equals(cname)) return types[i];
122         }        
123         return makeWithoutCaching(name);
124     }
125     
126     public static ClassNode getWrapper(ClassNode cn) {
127         cn = cn.redirect();
128         if (!isPrimitiveType(cn)) return cn;
129         if (cn==boolean_TYPE) {
130             return Boolean_TYPE;
131         } else if (cn==byte_TYPE) {
132             return Byte_TYPE;
133         } else if (cn==char_TYPE) {
134             return Character_TYPE;
135         } else if (cn==short_TYPE) {
136             return Short_TYPE;
137         } else if (cn==int_TYPE) {
138             return Integer_TYPE;
139         } else if (cn==long_TYPE) {
140             return Long_TYPE;
141         } else if (cn==float_TYPE) {
142             return Float_TYPE;
143         } else if (cn==double_TYPE) {
144             return Double_TYPE;
145         } else if (cn==VOID_TYPE) {
146         	return void_WRAPPER_TYPE;
147         }
148         else {
149             return cn;
150         }
151     }
152     
153     public static boolean isPrimitiveType(ClassNode cn) {
154         return  cn == boolean_TYPE ||
155                 cn == char_TYPE ||
156                 cn == byte_TYPE ||
157                 cn == short_TYPE ||
158                 cn == int_TYPE ||
159                 cn == long_TYPE ||
160                 cn == float_TYPE ||
161                 cn == double_TYPE ||
162                 cn == VOID_TYPE;
163     }
164     
165     public static ClassNode makeReference() {
166         return make(Reference.class);
167     }
168 
169 }