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);
}
}