aspect LocalDeclaration { // a local declaration is either a variable declaration or a parameter declaration interface LocalDeclaration extends Named { Access getTypeAccess(); String getID(); void setID(String id); Block getBlock(); ParameterDeclaration asParameterDeclaration(); VariableDeclaration asVariableDeclaration(); } ParameterDeclaration implements LocalDeclaration; VariableDeclaration implements LocalDeclaration; public ParameterDeclaration ParameterDeclaration.asParameterDeclaration() { return (ParameterDeclaration)fullCopy(); } public ParameterDeclaration VariableDeclaration.asParameterDeclaration() { return new ParameterDeclaration((Access)getTypeAccess().fullCopy(), getID()); } public VariableDeclaration ParameterDeclaration.asVariableDeclaration() { return new VariableDeclaration((Access)getTypeAccess().fullCopy(), getID()); } public VariableDeclaration VariableDeclaration.asVariableDeclaration() { return (VariableDeclaration)fullCopy(); } inh java.util.Set Stmt.visibleLocalDecls(); inh java.util.Set CatchClause.visibleLocalDecls(); eq CompilationUnit.getChild().visibleLocalDecls() = new HashSet(); eq TypeDecl.getChild().visibleLocalDecls() = new HashSet(); eq MethodDecl.getBlock().visibleLocalDecls() { HashSet decls = new HashSet(); for(int i=0;i