KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > aspectj > asm > internal > StructureNodeFactory


1
2 /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
3  *
4  * This file is part of the IDE support for the AspectJ(tm)
5  * programming language; see http://aspectj.org
6  *
7  * The contents of this file are subject to the Mozilla Public License
8  * Version 1.1 (the "License"); you may not use this file except in
9  * compliance with the License. You may obtain a copy of the License at
10  * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/.
11  *
12  * Software distributed under the License is distributed on an "AS IS" basis,
13  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14  * for the specific language governing rights and limitations under the
15  * License.
16  *
17  * The Original Code is AspectJ.
18  *
19  * The Initial Developer of the Original Code is Xerox Corporation. Portions
20  * created by Xerox Corporation are Copyright (C) 1999-2002 Xerox Corporation.
21  * All Rights Reserved.
22  *
23  * Contributor(s):
24  */

25
26 package org.aspectj.asm.internal;
27
28 import java.util.*;
29 import org.aspectj.compiler.base.ast.*;
30 import org.aspectj.compiler.crosscuts.ast.*;
31 import org.aspectj.asm.*;
32
33 /**
34  * @author Mik Kersten
35  */

36 public class StructureNodeFactory {
37
38     private static Hashtable programElementNodes = new Hashtable();
39     
40     private static final ProgramElementNode UNRESOLVED_LINK_NODE = new ProgramElementNode("<error: unresolved link>", ProgramElementNode.Kind.ERROR, null, null, "", "", "", null, null, null, false, null);
41
42     public static void clear() {
43         programElementNodes.clear();
44     }
45
46     public static ProgramElementNode makeNode(ASTObject astObject, List relations, List children) {
47         return makeNode(astObject, relations, children, false);
48     }
49
50     public static LinkNode makeLink(ASTObject astObject, boolean terminal) {
51         ProgramElementNode peNode = null;
52         if (terminal) {
53             peNode = makeNode(astObject, null, null, false);
54         } else {
55             peNode = makeNode(astObject, null, null, true);
56         }
57         
58         if (peNode == null) {
59             return new LinkNode(UNRESOLVED_LINK_NODE);
60         } else {
61             return new LinkNode(peNode);
62         }
63     }
64
65     private static ProgramElementNode makeNode(ASTObject astObject, List relations, List children, boolean resolve) {
66         if (resolve) {
67             if (astObject instanceof InitializerDec) {
68                 InitializerDec initDec = (InitializerDec)astObject;
69                 return (ProgramElementNode)programElementNodes.get(initDec.getDeclaringType().getTypeDec());
70             } else if (astObject instanceof Decs) {
71                 Decs decs = (Decs)astObject;
72                 return (ProgramElementNode)programElementNodes.get(decs.getDeclaringType().getTypeDec());
73             } else {
74                 ProgramElementNode peNode = (ProgramElementNode)programElementNodes.get(astObject);
75                 if (peNode == null) {
76                     return makeNode(astObject, null, null, false);
77                 } else {
78                     return peNode;
79                 }
80             }
81         } else {
82             String JavaDoc declaringType = "";
83             if (astObject.getDeclaringType() != null) {
84                 declaringType = astObject.getDeclaringType().toShortString();
85             }
86             
87             org.aspectj.asm.SourceLocation sourceLocation = new org.aspectj.asm.SourceLocation(
88                 astObject.getSourceLocation().getSourceFileName(),
89                 astObject.getSourceLocation().getBeginLine(),
90                 astObject.getSourceLocation().getEndLine(),
91                 astObject.getSourceLocation().getBeginColumn());
92             
93             ProgramElementNode newNode = new ProgramElementNode(
94                 genSignature(astObject).trim(),
95                 genKind(astObject),
96                 genModifiers(astObject),
97                 genAccessibility(astObject),
98                 declaringType,
99                 genPackageName(astObject),
100                 genFormalComment(astObject),
101                 sourceLocation,
102                 relations,
103                 children,
104                 isMemberKind(astObject),
105                 astObject);
106             programElementNodes.put(astObject, newNode);
107             newNode.setRunnable(genIsRunnable(newNode));
108             setSpecifiers(astObject, newNode);
109             
110             return newNode;
111         }
112     }
113
114     private static void setSpecifiers(ASTObject astObject, ProgramElementNode node) {
115         if (astObject instanceof MethodDec) {
116             Method method = ((MethodDec)astObject).getMethod();
117             for (Iterator it = method.getDeclaringType().getDirectSuperTypes().iterator(); it.hasNext(); ) {
118                 NameType type = (NameType)it.next();
119                 SemanticObject so = type.findMatchingSemanticObject(method);
120             
121                 if (so != null && so instanceof Method) {
122                     
123                     Method superMethod = (Method)so;
124                     if (so.isAbstract()) {
125                         node.setImplementor(true);
126                     } else {
127                         node.setOverrider(true);
128                     }
129                 }
130             }
131         }
132     }
133
134     private static boolean genIsRunnable(ProgramElementNode node) {
135         if (node.getModifiers().contains(ProgramElementNode.Modifiers.STATIC)
136             && node.getAccessibility().equals(ProgramElementNode.Accessibility.PUBLIC)
137             && node.getSignature().equals("main(String[])")) {
138             return true;
139         } else {
140             return false;
141         }
142     }
143
144     private static boolean genIsStmntKind(ASTObject astObject) {
145         return astObject instanceof CatchClause
146             || astObject instanceof SOLink
147             || astObject instanceof BasicAssignExpr;
148     }
149
150     private static List genModifiers(ASTObject astObject) {
151         List modifiers = new ArrayList();
152         if (astObject instanceof Dec) {
153             Dec dec = (Dec)astObject;
154             if (dec.getModifiers().isStrict()) modifiers.add(ProgramElementNode.Modifiers.STRICTFP);
155             if (dec.getModifiers().isAbstract()) modifiers.add(ProgramElementNode.Modifiers.ABSTRACT);
156             if (dec.getModifiers().isSynchronized()) modifiers.add(ProgramElementNode.Modifiers.SYNCHRONIZED);
157             if (dec.getModifiers().isNative()) modifiers.add(ProgramElementNode.Modifiers.NATIVE);
158             if (dec.getModifiers().isFinal()) modifiers.add(ProgramElementNode.Modifiers.FINAL);
159             if (dec.getModifiers().isTransient()) modifiers.add(ProgramElementNode.Modifiers.TRANSIENT);
160             if (dec.getModifiers().isStatic()) modifiers.add(ProgramElementNode.Modifiers.STATIC);
161             if (dec.getModifiers().isVolatile()) modifiers.add(ProgramElementNode.Modifiers.VOLATILE);
162         }
163         return modifiers;
164     }
165
166     private static ProgramElementNode.Accessibility genAccessibility(ASTObject astObject) {
167         //List modifiers = new ArrayList();
168
if (astObject instanceof Dec) {
169             Dec dec = (Dec)astObject;
170             if (dec.getModifiers().isPublic()) return ProgramElementNode.Accessibility.PUBLIC;
171             if (dec.getModifiers().isProtected()) return ProgramElementNode.Accessibility.PROTECTED;
172             if (dec.getModifiers().isPrivileged()) return ProgramElementNode.Accessibility.PRIVILEGED;
173             if (dec.getModifiers().isPackagePrivate()) return ProgramElementNode.Accessibility.PACKAGE;
174             if (dec.getModifiers().isPrivate()) return ProgramElementNode.Accessibility.PRIVATE;
175         }
176         return ProgramElementNode.Accessibility.PUBLIC;
177     }
178
179     /**
180      * @todo special cases should be fixes to AST nodes, this should have no instanceof tests.
181      */

182     private static ProgramElementNode.Kind genKind(ASTObject astObject) {
183         if (astObject instanceof CompilationUnit) {
184             return ProgramElementNode.Kind.FILE_JAVA;
185         } else if (genIsStmntKind(astObject)) {
186             return ProgramElementNode.Kind.CODE;
187         } else if (astObject instanceof Dec) {
188             String JavaDoc kindString = ((Dec)astObject).getKind();
189             return ProgramElementNode.Kind.getKindForString(kindString);
190         } else {
191             return ProgramElementNode.Kind.ERROR;
192         }
193     }
194
195     private static boolean isMemberKind(ASTObject astObject) {
196         if (astObject instanceof Dec) {
197             Dec dec = (Dec)astObject;
198             return dec.getDeclaringType() != null && !dec.getDeclaringType().equals(dec.getName());
199         } else {
200             return false;
201         }
202     }
203
204     private static String JavaDoc genPackageName(ASTObject astObject) {
205         if (astObject instanceof TypeDec) {
206             return ((TypeDec)astObject).getPackageName();
207         } else if (astObject instanceof CompilationUnit) {
208             return ((CompilationUnit)astObject).getPackageName();
209         } else if (astObject.getDeclaringType() != null) {
210             return astObject.getDeclaringType().getPackageName();
211         } else {
212             return "";
213         }
214     }
215
216     private static String JavaDoc genDeclaringType(ASTObject astObject) {
217         if (astObject != null && astObject.getDeclaringType() != null) {
218             return astObject.getDeclaringType().toShortString();
219         } else {
220             return null;
221         }
222     }
223
224     /**
225      * Tries to return the ajdoc generated comment, otherwise returns the raw comment.
226      */

227     private static String JavaDoc genFormalComment(ASTObject astObject) {
228         try {
229             return (String JavaDoc)astObject.getComment().getClass().getMethod("commentText", new Class JavaDoc[]{}).invoke(astObject.getComment(), new Object JavaDoc[]{});
230         } catch (Throwable JavaDoc t) {
231             if (astObject != null) {
232                 return astObject.getFormalComment();
233             } else {
234                 return "";
235             }
236         }
237     }
238
239     /**
240      * Specialized signature generation for nodes in the structure model.
241      *
242      * @todo the compiler should generate these names, doing it this way is atrocious
243      */

244     private static String JavaDoc genSignature(ASTObject astObject) {
245         String JavaDoc name = "";
246         if (astObject instanceof CompilationUnit) {
247             return astObject.getSourceFile().getName();
248         } else if (astObject instanceof MethodDec) {
249             Method method = ((MethodDec)astObject).getMethod();
250             return method.getName() + method.getFormals().toShortString();
251         } else if (astObject instanceof TypeDec) {
252             return ((TypeDec)astObject).getSourceExtendedId();
253         } else if (astObject instanceof FieldDec) {
254             return ((FieldDec)astObject).getName();
255         } else if (astObject instanceof ConstructorDec) {
256             ConstructorDec constructorDec = (ConstructorDec)astObject;
257             return constructorDec.getDeclaringType().getSourceExtendedId() + constructorDec.getFormals().toShortString();
258       } else if (astObject instanceof IntroducedDec) {
259             IntroducedDec introDec = (IntroducedDec)astObject;
260             return introDec.getTargets().toShortString() + '.' + genSignature(introDec.getDec());
261 // introDec.toShortString();
262
} else if (astObject instanceof PointcutDec) {
263             PointcutDec pointcutDec = (PointcutDec)astObject;
264             return pointcutDec.getName() + pointcutDec.getFormals().toShortString();
265 // } else if (astObject instanceof CallExpr) {
266
// CallExpr call = (CallExpr)astObject;
267
// name = call.get;
268
} else if (astObject instanceof ShowErrorDec) {
269             ShowErrorDec errorDec = (ShowErrorDec)astObject;
270             return errorDec.toShortString();
271         } else if (astObject instanceof SoftThrowableDec) {
272             SoftThrowableDec softThrowableDec = (SoftThrowableDec)astObject;
273             return softThrowableDec.toShortString();
274         } else if (astObject instanceof IntroducedSuperDec) {
275             IntroducedSuperDec introducedSuperDec = (IntroducedSuperDec)astObject;
276             return introducedSuperDec.toShortString();
277         } else if (astObject instanceof AdviceDec) {
278             AdviceDec adviceDec = (AdviceDec)astObject;
279             return adviceDec.toShortString();
280         } else if (astObject instanceof SOLink) {
281             SOLink soLink = (SOLink)astObject;
282             return genSignature(soLink.getTarget().getCorrespondingDec());
283         } else if (astObject instanceof CatchClause) {
284             CatchClause catchClause = (CatchClause)astObject;
285             return catchClause.getFormal().getType().getSourceExtendedId();
286         } else if (astObject instanceof BasicAssignExpr) {
287             return astObject.unparse();
288 // } else if (genIsStmntKind(astObject)) {
289
// name = astObject.unparse();
290
// name = name.replace('/', ' ');
291
// name = name.replace('*', ' ');
292
// name = name.replace('\n', ' ');
293
// name.trim();
294
// java.util.StringTokenizer st = new java.util.StringTokenizer(name, " ");
295
// String s = "";
296
// while (st.hasMoreElements()) {
297
// s += ((String)st.nextElement()).trim() + " ";
298
// }
299
// name = s;
300
// int endIndex = name.indexOf(')');
301
// if (endIndex != -1) {
302
// name = name.substring(0, endIndex+1);
303
// }
304
// if (name.startsWith("this.")) {
305
// name = name.substring(5);
306
// }
307
} else {
308             return "? " + astObject.toShortString();
309         }
310     }
311 }
Popular Tags