aspect PackageDecl { private Collection Program.packageDecls = new LinkedList(); syn boolean Program.hasPackageDecl(String name) { for(PackageDecl pd : packageDecls) if(pd.getName().equals(name)) return true; return false; } syn lazy PackageDecl Program.getPackageDecl(String name) { for(PackageDecl pd : packageDecls) if(pd.getName().equals(name)) return pd; PackageDecl pd = new PackageDecl(name); addPackageDecl(pd); pd.setParent(this); return pd; } private void Program.addPackageDecl(PackageDecl pd) { packageDecls.add(pd); } syn lazy Collection Program.getSubPackageDecls(String name) { Collection res = new LinkedList(); for(PackageDecl pd : packageDecls) if(pd.getName().startsWith(name+".")) res.add(pd); return res; } inh PackageDecl Expr.lookupPackage(String name); eq Program.getChild().lookupPackage(String name) = getPackageDecl(name); syn PackageDecl PackageAccess.decl() = lookupPackage(getPackage()); PackageDecl implements SimpleSet; syn int PackageDecl.size() = 1; syn boolean PackageDecl.isEmpty() = false; public SimpleSet PackageDecl.add(Object o) { return new SimpleSetImpl().add(this).add(o); } syn boolean PackageDecl.contains(Object o) = this == o; public boolean PackageDecl.isSingleton() { return true; } public boolean PackageDecl.isSingleton(Object o) { return contains(o); } PackageDecl implements Iterator; private PackageDecl PackageDecl.iterElem; public Iterator PackageDecl.iterator() { iterElem = this; return this; } public boolean PackageDecl.hasNext() { return iterElem != null; } public Object PackageDecl.next() { Object o = iterElem; iterElem = null; return o; } public void PackageDecl.remove() { throw new UnsupportedOperationException(); } public String PackageAccess.getTopLevelPackage() { String[] comp = getPackage().split("\\."); if(comp.length == 0) return null; return comp[0]; } public String TypeAccess.getTopLevelPackage() { String[] comp = packageName().split("\\."); if(comp.length == 0) return null; return comp[0]; } }