package st.gravel.support.compiler.ast; /* This file is automatically generated from typed smalltalk source. Do not edit by hand. (C) AG5.com */ import java.math.BigInteger; import st.gravel.support.jvm.NonLocalReturn; import st.gravel.support.compiler.ast.NodeCopier; import st.gravel.support.compiler.ast.NodeCopier.NodeCopier_Factory; import st.gravel.support.compiler.ast.Node; import java.util.Set; import java.util.List; import java.util.HashSet; import java.util.ArrayList; import st.gravel.support.compiler.ast.BoundVariableDeclarationNode; import st.gravel.support.compiler.ast.HolderDeclarationNode; import st.gravel.support.compiler.ast.LocalReadNode; import st.gravel.support.compiler.ast.Expression; import st.gravel.support.compiler.ast.LocalWriteNode; import st.gravel.support.compiler.ast.NonLocalReturnNode; import st.gravel.support.compiler.ast.Statement; import st.gravel.support.compiler.ast.ReadHolderNode; import st.gravel.support.compiler.ast.SelfNode; import st.gravel.support.compiler.ast.SuperNode; import st.gravel.support.compiler.ast.ToDoNode; import st.gravel.support.compiler.ast.VariableDeclarationNode; import st.gravel.support.compiler.ast.VariableNode; import st.gravel.support.compiler.ast.NodeVisitorError; import st.gravel.support.compiler.ast.WriteHolderNode; public class NonLocalVariableFinder extends NodeCopier implements Cloneable { public static NonLocalVariableFinder_Factory factory = new NonLocalVariableFinder_Factory(); java.util.Set<String> _locals; List<String> _nonLocals; public static class NonLocalVariableFinder_Factory extends NodeCopier_Factory { public String[] analyze_(final Node _aNode) { NonLocalVariableFinder _temp1 = this.basicNew(); _temp1.visit_(_aNode); return _temp1.nonLocals(); } public NonLocalVariableFinder basicNew() { NonLocalVariableFinder newInstance = new NonLocalVariableFinder(); newInstance.initialize(); return newInstance; } } static public String[] _analyze_(Object receiver, final Node _aNode) { return factory.analyze_(_aNode); } public NonLocalVariableFinder addVarAccess_(final String _varName) { if (!(_locals.contains(_varName) || _nonLocals.contains(_varName))) { _nonLocals.add(_varName); } return this; } public NonLocalVariableFinder copy() { try { NonLocalVariableFinder _temp1 = (NonLocalVariableFinder) this.clone(); _temp1.postCopy(); return _temp1; } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } } public NonLocalVariableFinder_Factory factory() { return factory; } @Override public NonLocalVariableFinder initialize() { super.initialize(); _locals = new java.util.HashSet(); _nonLocals = new java.util.ArrayList(); return this; } public String[] nonLocals() { return _nonLocals.toArray(new String[_nonLocals.size()]); } @Override public BoundVariableDeclarationNode visitBoundVariableDeclarationNode_(final BoundVariableDeclarationNode _anObject) { _locals.add(_anObject.name()); return super.visitBoundVariableDeclarationNode_(_anObject); } @Override public HolderDeclarationNode visitHolderDeclarationNode_(final HolderDeclarationNode _anObject) { _locals.add(_anObject.name()); return super.visitHolderDeclarationNode_(_anObject); } @Override public Expression visitLocalReadNode_(final LocalReadNode _anObject) { this.addVarAccess_(_anObject.name()); return super.visitLocalReadNode_(_anObject); } @Override public LocalWriteNode visitLocalWriteNode_(final LocalWriteNode _anObject) { this.addVarAccess_(_anObject.name()); return super.visitLocalWriteNode_(_anObject); } @Override public Statement visitNonLocalReturnNode_(final NonLocalReturnNode _anObject) { this.addVarAccess_(_anObject.marker()); return super.visitNonLocalReturnNode_(_anObject); } @Override public ReadHolderNode visitReadHolderNode_(final ReadHolderNode _anObject) { this.addVarAccess_(_anObject.varName()); return super.visitReadHolderNode_(_anObject); } @Override public Expression visitSelfNode_(final SelfNode _anObject) { this.addVarAccess_("self"); return super.visitSelfNode_(_anObject); } @Override public SuperNode visitSuperNode_(final SuperNode _anObject) { this.addVarAccess_("self"); return super.visitSuperNode_(_anObject); } @Override public ToDoNode visitToDoNode_(final ToDoNode _anObject) { _locals.add(_anObject.counterName()); return super.visitToDoNode_(_anObject); } @Override public VariableDeclarationNode visitVariableDeclarationNode_(final VariableDeclarationNode _anObject) { _locals.add(_anObject.name()); return super.visitVariableDeclarationNode_(_anObject); } @Override public Expression visitVariableNode_(final VariableNode _anObject) { throw NodeVisitorError.factory.basicNew(); } @Override public WriteHolderNode visitWriteHolderNode_(final WriteHolderNode _anObject) { this.addVarAccess_(_anObject.varName()); return super.visitWriteHolderNode_(_anObject); } }