• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 import org.clearsilver.HDF;
18 import org.clearsilver.CS;
19 import java.util.*;
20 import java.io.*;
21 
22 public class TypeInfo
23 {
TypeInfo(boolean isPrimitive, String dimension, String simpleTypeName, String qualifiedTypeName, ClassInfo cl)24     public TypeInfo(boolean isPrimitive, String dimension,
25             String simpleTypeName, String qualifiedTypeName,
26             ClassInfo cl)
27     {
28         mIsPrimitive = isPrimitive;
29         mDimension = dimension;
30         mSimpleTypeName = simpleTypeName;
31         mQualifiedTypeName = qualifiedTypeName;
32         mClass = cl;
33     }
34 
asClassInfo()35     public ClassInfo asClassInfo()
36     {
37         return mClass;
38     }
39 
isPrimitive()40     public boolean isPrimitive()
41     {
42         return mIsPrimitive;
43     }
44 
dimension()45     public String dimension()
46     {
47         return mDimension;
48     }
49 
simpleTypeName()50     public String simpleTypeName()
51     {
52         return mSimpleTypeName;
53     }
54 
qualifiedTypeName()55     public String qualifiedTypeName()
56     {
57         return mQualifiedTypeName;
58     }
59 
fullName()60     public String fullName()
61     {
62         if (mFullName != null) {
63             return mFullName;
64         } else {
65             return fullName(new HashSet());
66         }
67     }
68 
typeArgumentsName(TypeInfo[] args, HashSet<String> typeVars)69     public static String typeArgumentsName(TypeInfo[] args, HashSet<String> typeVars)
70     {
71         String result = "<";
72         for (int i=0; i<args.length; i++) {
73             result += args[i].fullName(typeVars);
74             if (i != args.length-1) {
75                 result += ", ";
76             }
77         }
78         result += ">";
79         return result;
80     }
81 
fullName(HashSet<String> typeVars)82     public String fullName(HashSet<String> typeVars)
83     {
84         mFullName = fullNameNoDimension(typeVars) + mDimension;
85         return mFullName;
86     }
87 
fullNameNoDimension(HashSet<String> typeVars)88     public String fullNameNoDimension(HashSet<String> typeVars)
89     {
90         String fullName = null;
91         if (mIsTypeVariable) {
92             if (typeVars.contains(mQualifiedTypeName)) {
93                 // don't recurse forever with the parameters.  This handles
94                 // Enum<K extends Enum<K>>
95                 return mQualifiedTypeName;
96             }
97             typeVars.add(mQualifiedTypeName);
98         }
99 /*
100         if (fullName != null) {
101             return fullName;
102         }
103 */
104         fullName = mQualifiedTypeName;
105         if (mTypeArguments != null && mTypeArguments.length > 0) {
106             fullName += typeArgumentsName(mTypeArguments, typeVars);
107         }
108         else if (mSuperBounds != null && mSuperBounds.length > 0) {
109             fullName += " super " + mSuperBounds[0].fullName(typeVars);
110             for (int i=1; i<mSuperBounds.length; i++) {
111                 fullName += " & " + mSuperBounds[i].fullName(typeVars);
112             }
113         }
114         else if (mExtendsBounds != null && mExtendsBounds.length > 0) {
115             fullName += " extends " + mExtendsBounds[0].fullName(typeVars);
116             for (int i=1; i<mExtendsBounds.length; i++) {
117                 fullName += " & " + mExtendsBounds[i].fullName(typeVars);
118             }
119         }
120         return fullName;
121     }
122 
typeArguments()123     public TypeInfo[] typeArguments()
124     {
125         return mTypeArguments;
126     }
127 
makeHDF(HDF data, String base)128     public void makeHDF(HDF data, String base)
129     {
130         makeHDFRecursive(data, base, false, false, new HashSet<String>());
131     }
132 
makeQualifiedHDF(HDF data, String base)133     public void makeQualifiedHDF(HDF data, String base)
134     {
135         makeHDFRecursive(data, base, true, false, new HashSet<String>());
136     }
137 
makeHDF(HDF data, String base, boolean isLastVararg, HashSet<String> typeVariables)138     public void makeHDF(HDF data, String base, boolean isLastVararg,
139             HashSet<String> typeVariables)
140     {
141         makeHDFRecursive(data, base, false, isLastVararg, typeVariables);
142     }
143 
makeQualifiedHDF(HDF data, String base, HashSet<String> typeVariables)144     public void makeQualifiedHDF(HDF data, String base, HashSet<String> typeVariables)
145     {
146         makeHDFRecursive(data, base, true, false, typeVariables);
147     }
148 
makeHDFRecursive(HDF data, String base, boolean qualified, boolean isLastVararg, HashSet<String> typeVars)149     private void makeHDFRecursive(HDF data, String base, boolean qualified,
150             boolean isLastVararg, HashSet<String> typeVars)
151     {
152         String label = qualified ? qualifiedTypeName() : simpleTypeName();
153         label += (isLastVararg) ? "..." : dimension();
154         data.setValue(base + ".label", label);
155         ClassInfo cl = asClassInfo();
156         if (mIsTypeVariable || mIsWildcard) {
157             // could link to an @param tag on the class to describe this
158             // but for now, just don't make it a link
159         }
160         else if (!isPrimitive() && cl != null && cl.isIncluded()) {
161             data.setValue(base + ".link", cl.htmlPage());
162             data.setValue(base + ".since", cl.getSince());
163         }
164 
165         if (mIsTypeVariable) {
166             if (typeVars.contains(qualifiedTypeName())) {
167                 // don't recurse forever with the parameters.  This handles
168                 // Enum<K extends Enum<K>>
169                 return;
170             }
171             typeVars.add(qualifiedTypeName());
172         }
173         if (mTypeArguments != null) {
174             TypeInfo.makeHDF(data, base + ".typeArguments", mTypeArguments, qualified, typeVars);
175         }
176         if (mSuperBounds != null) {
177             TypeInfo.makeHDF(data, base + ".superBounds", mSuperBounds, qualified, typeVars);
178         }
179         if (mExtendsBounds != null) {
180             TypeInfo.makeHDF(data, base + ".extendsBounds", mExtendsBounds, qualified, typeVars);
181         }
182     }
183 
makeHDF(HDF data, String base, TypeInfo[] types, boolean qualified, HashSet<String> typeVariables)184     public static void makeHDF(HDF data, String base, TypeInfo[] types, boolean qualified,
185             HashSet<String> typeVariables)
186     {
187         final int N = types.length;
188         for (int i=0; i<N; i++) {
189             types[i].makeHDFRecursive(data, base + "." + i, qualified, false, typeVariables);
190         }
191     }
192 
makeHDF(HDF data, String base, TypeInfo[] types, boolean qualified)193     public static void makeHDF(HDF data, String base, TypeInfo[] types, boolean qualified)
194     {
195         makeHDF(data, base, types, qualified, new HashSet<String>());
196     }
197 
setTypeArguments(TypeInfo[] args)198     void setTypeArguments(TypeInfo[] args)
199     {
200         mTypeArguments = args;
201     }
202 
setBounds(TypeInfo[] superBounds, TypeInfo[] extendsBounds)203     void setBounds(TypeInfo[] superBounds, TypeInfo[] extendsBounds)
204     {
205         mSuperBounds = superBounds;
206         mExtendsBounds = extendsBounds;
207     }
208 
setIsTypeVariable(boolean b)209     void setIsTypeVariable(boolean b)
210     {
211         mIsTypeVariable = b;
212     }
213 
setIsWildcard(boolean b)214     void setIsWildcard(boolean b)
215     {
216         mIsWildcard = b;
217     }
218 
typeVariables(TypeInfo[] params)219     static HashSet<String> typeVariables(TypeInfo[] params)
220     {
221         return typeVariables(params, new HashSet());
222     }
223 
typeVariables(TypeInfo[] params, HashSet<String> result)224     static HashSet<String> typeVariables(TypeInfo[] params, HashSet<String> result)
225     {
226         for (TypeInfo t: params) {
227             if (t.mIsTypeVariable) {
228                 result.add(t.mQualifiedTypeName);
229             }
230         }
231         return result;
232     }
233 
234 
isTypeVariable()235     public boolean isTypeVariable()
236     {
237         return mIsTypeVariable;
238     }
239 
defaultValue()240     public String defaultValue() {
241         if (mIsPrimitive) {
242             if ("boolean".equals(mSimpleTypeName)) {
243                 return "false";
244             } else {
245                 return "0";
246             }
247         } else {
248             return "null";
249         }
250     }
251 
252     @Override
toString()253     public String toString(){
254       String returnString = "";
255       returnString += "Primitive?: " + mIsPrimitive + " TypeVariable?: " +
256       mIsTypeVariable + " Wildcard?: " + mIsWildcard + " Dimension: " + mDimension
257       + " QualifedTypeName: " + mQualifiedTypeName;
258 
259       if (mTypeArguments != null){
260         returnString += "\nTypeArguments: ";
261         for (TypeInfo tA : mTypeArguments){
262           returnString += tA.qualifiedTypeName() + "(" + tA + ") ";
263         }
264       }
265       if (mSuperBounds != null){
266         returnString += "\nSuperBounds: ";
267         for (TypeInfo tA : mSuperBounds){
268           returnString += tA.qualifiedTypeName() + "(" + tA + ") ";
269         }
270       }
271       if (mExtendsBounds != null){
272         returnString += "\nExtendsBounds: ";
273         for (TypeInfo tA : mExtendsBounds){
274           returnString += tA.qualifiedTypeName() + "(" + tA + ") ";
275         }
276       }
277       return returnString;
278     }
279 
280     private boolean mIsPrimitive;
281     private boolean mIsTypeVariable;
282     private boolean mIsWildcard;
283     private String mDimension;
284     private String mSimpleTypeName;
285     private String mQualifiedTypeName;
286     private ClassInfo mClass;
287     private TypeInfo[] mTypeArguments;
288     private TypeInfo[] mSuperBounds;
289     private TypeInfo[] mExtendsBounds;
290     private String mFullName;
291 }
292