1 2 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 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 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 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 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 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 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 genDeclaringType(ASTObject astObject) { 217 if (astObject != null && astObject.getDeclaringType() != null) { 218 return astObject.getDeclaringType().toShortString(); 219 } else { 220 return null; 221 } 222 } 223 224 227 private static String genFormalComment(ASTObject astObject) { 228 try { 229 return (String )astObject.getComment().getClass().getMethod("commentText", new Class []{}).invoke(astObject.getComment(), new Object []{}); 230 } catch (Throwable t) { 231 if (astObject != null) { 232 return astObject.getFormalComment(); 233 } else { 234 return ""; 235 } 236 } 237 } 238 239 244 private static String genSignature(ASTObject astObject) { 245 String 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 } else if (astObject instanceof PointcutDec) { 263 PointcutDec pointcutDec = (PointcutDec)astObject; 264 return pointcutDec.getName() + pointcutDec.getFormals().toShortString(); 265 } 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 { 308 return "? " + astObject.toShortString(); 309 } 310 } 311 } | Popular Tags |