diff options
Diffstat (limited to 'src/main/java/io/devnulllabs/openjava/ptree/util/ScopeHandler.java')
-rw-r--r-- | src/main/java/io/devnulllabs/openjava/ptree/util/ScopeHandler.java | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/src/main/java/io/devnulllabs/openjava/ptree/util/ScopeHandler.java b/src/main/java/io/devnulllabs/openjava/ptree/util/ScopeHandler.java new file mode 100644 index 0000000..0afb937 --- /dev/null +++ b/src/main/java/io/devnulllabs/openjava/ptree/util/ScopeHandler.java @@ -0,0 +1,305 @@ +/* + * ScopeHandler.java + * + * comments here. + * + * @author Michiaki Tatsubori + * @version %VERSION% %DATE% + * @see java.lang.Object + * + * COPYRIGHT 1998 by Michiaki Tatsubori, ALL RIGHTS RESERVED. + */ +package io.devnulllabs.openjava.ptree.util; + +import java.util.Stack; + +import io.devnulllabs.openjava.mop.AnonymousClassEnvironment; +import io.devnulllabs.openjava.mop.ClassEnvironment; +import io.devnulllabs.openjava.mop.ClosedEnvironment; +import io.devnulllabs.openjava.mop.Environment; +import io.devnulllabs.openjava.mop.FileEnvironment; +import io.devnulllabs.openjava.mop.OJClass; +import io.devnulllabs.openjava.ptree.AllocationExpression; +import io.devnulllabs.openjava.ptree.Block; +import io.devnulllabs.openjava.ptree.ClassDeclaration; +import io.devnulllabs.openjava.ptree.CompilationUnit; +import io.devnulllabs.openjava.ptree.ConstructorDeclaration; +import io.devnulllabs.openjava.ptree.DoWhileStatement; +import io.devnulllabs.openjava.ptree.Expression; +import io.devnulllabs.openjava.ptree.ForStatement; +import io.devnulllabs.openjava.ptree.IfStatement; +import io.devnulllabs.openjava.ptree.MemberDeclaration; +import io.devnulllabs.openjava.ptree.MemberDeclarationList; +import io.devnulllabs.openjava.ptree.MemberInitializer; +import io.devnulllabs.openjava.ptree.MethodDeclaration; +import io.devnulllabs.openjava.ptree.ParseTreeException; +import io.devnulllabs.openjava.ptree.Statement; +import io.devnulllabs.openjava.ptree.SwitchStatement; +import io.devnulllabs.openjava.ptree.SynchronizedStatement; +import io.devnulllabs.openjava.ptree.TryStatement; +import io.devnulllabs.openjava.ptree.WhileStatement; + +/** + * The class <code>ScopeHandler</code> + * <p> + * For example + * <pre> + * </pre> + * <p> + * + * @author Michiaki Tatsubori + * @version 1.0 + * @since $Id: ScopeHandler.java,v 1.2 2003/02/19 02:55:00 tatsubori Exp $ + * @see io.devnulllabs.openjava.ptree.ParseTree + * @see io.devnulllabs.openjava.ptree.util.ParseTreeVisitor + * @see io.devnulllabs.openjava.ptree.util.EvaluationShuttle + */ +public abstract class ScopeHandler extends EvaluationShuttle { + private Stack env_nest = new Stack(); + + public ScopeHandler(Environment base_env) { + super(base_env); + } + + protected final void pushClosedEnvironment() { + push(new ClosedEnvironment(getEnvironment())); + } + + protected final void push(Environment env) { + env_nest.push(getEnvironment()); + setEnvironment(env); + } + + protected final void pop() { + setEnvironment((Environment) env_nest.pop()); + } + + /* in walking down through parse tree */ + + /* compilation unit */ + public CompilationUnit evaluateDown(CompilationUnit ptree) + throws ParseTreeException { + ClassDeclaration pubclazz = ptree.getPublicClass(); + String name = + (pubclazz != null) ? pubclazz.getName() : "<no public class>"; + FileEnvironment fenv = + new FileEnvironment(getEnvironment(), ptree, name); + + push(fenv); + + return ptree; + } + + /* class declaration */ + public ClassDeclaration evaluateDown(ClassDeclaration ptree) + throws ParseTreeException { + /* records this class */ + if (getEnvironment() instanceof ClosedEnvironment) { + recordLocalClass(ptree); + } + + /* creates a new class environment */ + ClassEnvironment env = + new ClassEnvironment(getEnvironment(), ptree.getName()); + MemberDeclarationList mdecls = ptree.getBody(); + for (int i = 0; i < mdecls.size(); ++i) { + MemberDeclaration m = mdecls.get(i); + if (!(m instanceof ClassDeclaration)) + continue; + ClassDeclaration inner = (ClassDeclaration) m; + env.recordMemberClass(inner.getName()); + } + push(env); + + return ptree; + } + + private void recordLocalClass(ClassDeclaration ptree) { + String classname = ptree.getName(); + Environment outer_env = getEnvironment(); + String qname = outer_env.toQualifiedName(classname); + if (outer_env.lookupClass(qname) != null) + return; + try { + OJClass out_clazz = + outer_env.lookupClass(outer_env.currentClassName()); + /***** this will be recorded in global env */ + //OJClass clazz = OJClass.forParseTree(outer_env, out_clazz, ptree); + OJClass clazz = new OJClass(outer_env, out_clazz, ptree); + outer_env.record(classname, clazz); + } catch (Exception ex) { + System.err.println("unknown error: " + ex); + return; + } + } + + /* class body contents */ + public MemberDeclaration evaluateDown(MethodDeclaration ptree) + throws ParseTreeException { + pushClosedEnvironment(); + return ptree; + } + + public MemberDeclaration evaluateDown(ConstructorDeclaration ptree) + throws ParseTreeException { + pushClosedEnvironment(); + return ptree; + } + + public MemberDeclaration evaluateDown(MemberInitializer ptree) + throws ParseTreeException { + pushClosedEnvironment(); + return ptree; + } + + /* statements */ + public Statement evaluateDown(Block ptree) throws ParseTreeException { + pushClosedEnvironment(); + return ptree; + } + + public Statement evaluateDown(SwitchStatement ptree) + throws ParseTreeException { + pushClosedEnvironment(); + return ptree; + } + + public Statement evaluateDown(IfStatement ptree) + throws ParseTreeException { + pushClosedEnvironment(); + return ptree; + } + + public Statement evaluateDown(WhileStatement ptree) + throws ParseTreeException { + pushClosedEnvironment(); + return ptree; + } + + public Statement evaluateDown(DoWhileStatement ptree) + throws ParseTreeException { + pushClosedEnvironment(); + return ptree; + } + + public Statement evaluateDown(ForStatement ptree) + throws ParseTreeException { + pushClosedEnvironment(); + return ptree; + } + + public Statement evaluateDown(TryStatement ptree) + throws ParseTreeException { + pushClosedEnvironment(); + return ptree; + } + + public Statement evaluateDown(SynchronizedStatement ptree) + throws ParseTreeException { + pushClosedEnvironment(); + return ptree; + } + + public Expression evaluateDown(AllocationExpression ptree) + throws ParseTreeException { + MemberDeclarationList cbody = ptree.getClassBody(); + if (cbody != null) { + String baseName = ptree.getClassType().toString(); + push( + new AnonymousClassEnvironment( + getEnvironment(), + baseName, + cbody)); + } else { + pushClosedEnvironment(); + } + return ptree; + } + + /* in walking down through parse tree */ + + /* class declaration */ + public CompilationUnit evaluateUp(CompilationUnit ptree) + throws ParseTreeException { + pop(); + return ptree; + } + + /* class declaration */ + public ClassDeclaration evaluateUp(ClassDeclaration ptree) + throws ParseTreeException { + pop(); + return ptree; + } + + /* class body contents */ + public MemberDeclaration evaluateUp(MethodDeclaration ptree) + throws ParseTreeException { + pop(); + return ptree; + } + + public MemberDeclaration evaluateUp(ConstructorDeclaration ptree) + throws ParseTreeException { + pop(); + return ptree; + } + + public MemberDeclaration evaluateUp(MemberInitializer ptree) + throws ParseTreeException { + pop(); + return ptree; + } + + /* statements */ + public Statement evaluateUp(Block ptree) throws ParseTreeException { + pop(); + return ptree; + } + + public Statement evaluateUp(SwitchStatement ptree) + throws ParseTreeException { + pop(); + return ptree; + } + + public Statement evaluateUp(IfStatement ptree) throws ParseTreeException { + pop(); + return ptree; + } + + public Statement evaluateUp(WhileStatement ptree) + throws ParseTreeException { + pop(); + return ptree; + } + + public Statement evaluateUp(DoWhileStatement ptree) + throws ParseTreeException { + pop(); + return ptree; + } + + public Statement evaluateUp(ForStatement ptree) throws ParseTreeException { + pop(); + return ptree; + } + + public Statement evaluateUp(TryStatement ptree) throws ParseTreeException { + pop(); + return ptree; + } + + public Statement evaluateUp(SynchronizedStatement ptree) + throws ParseTreeException { + pop(); + return ptree; + } + + public Expression evaluateUp(AllocationExpression ptree) + throws ParseTreeException { + pop(); + return ptree; + } + +} |