1 24 25 package org.aspectj.compiler.base.ast; 26 27 import org.aspectj.compiler.base.*; 28 import org.aspectj.compiler.base.cst.*; 29 import org.aspectj.compiler.base.bytecode.ClassManager; 30 31 import java.util.*; 32 33 37 38 public class PackageSO extends CompilerObject { 39 private String packageName; 40 private Map typeCache = new HashMap(); 41 private Map childPackages = new HashMap(); 42 43 public ClassManager classManager; 44 45 public PackageSO(JavaCompiler compiler, String packageName, 46 ClassManager classManager) { 47 super(compiler); 48 this.packageName = packageName; 49 this.classManager = classManager; 50 } 51 52 public void addType(Type newType) { 53 String className = newType.getTypeDec().getExtendedId(); 54 55 Type type = (Type)typeCache.get(className); 56 if (type != null && type != newType) { 57 type.getTypeDec().showError("duplicate type name not allowed: " + 58 type.getString()); 59 newType.getTypeDec().showError("duplicate type name not allowed: " + 60 type.getString()); 61 } 62 if (childPackages.containsKey(className)) { 63 newType.getTypeDec().showError(newType.getString() + 64 " clashes with package of the same name"); 65 return; 66 } 67 typeCache.put(className, newType); 68 } 69 70 private static final Type NOT_FOUND = new NullType(null); 71 72 public Type findType(String className) { 73 Type type = (Type)typeCache.get(className); 74 if (type != null) { 75 if (type == NOT_FOUND) return null; 76 else return type; 77 } 78 79 type = findTypeOnClassPath(className); 81 if (type != null) { 82 typeCache.put(className, type); 83 ((NameType)type).setLazy(); 84 return type; 85 } else { 86 typeCache.put(className, NOT_FOUND); 87 return null; 88 } 89 } 90 91 public boolean containsSubPackage(String packageName) { 92 PackageSO p = (PackageSO)childPackages.get(packageName); 93 if (p == null) return false; 94 return p.size() > 0; 95 } 96 97 public PackageSO findPackage(String packageName) { 98 101 PackageSO p = (PackageSO)childPackages.get(packageName); 102 if (p != null) return p; 103 104 p = new PackageSO(getCompiler(), makeName(this.packageName, packageName), 107 classManager.makeSubPackageManager(packageName)); 108 childPackages.put(packageName, p); 111 return p; 112 } 113 114 public int size() { return typeCache.size(); } 115 116 private final String makeName(String n1, String n2) { 117 if (n1 == null) return n2; 118 return n1 + '.' + n2; 119 } 120 121 public Type findTypeOnClassPath(String name) { 123 TypeDec ret = classManager.findTypeDec(name); 126 if (ret == null) return null; 127 128 if (!(ret.getFullName().equals(makeName(packageName, name)))) { 131 getCompiler().showMessage(" case mismatch, not loading: " + ret.getFullName()); 132 return null; 133 } 134 return ret.getType(); 135 } 136 } 137 | Popular Tags |