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.AssignmentNode;
import st.gravel.support.compiler.ast.Expression;
import st.gravel.support.compiler.ast.WriteHolderNode;
import st.gravel.support.compiler.ast.VariableNode;
import st.gravel.support.compiler.ast.SequenceNode;
import java.util.List;
import st.gravel.support.compiler.ast.VariableDeclarationNode;
import st.gravel.support.compiler.ast.Statement;
import java.util.ArrayList;
import st.gravel.support.compiler.ast.HolderDeclarationNode;
import st.gravel.support.compiler.ast.TypeNode;
import st.gravel.support.compiler.ast.CreateHolderNode;
import st.gravel.support.compiler.ast.ReadHolderNode;
public class VariableToHolderRewriter extends NodeCopier implements Cloneable {
public static VariableToHolderRewriter_Factory factory = new VariableToHolderRewriter_Factory();
String _varName;
public static class VariableToHolderRewriter_Factory extends NodeCopier_Factory {
public VariableToHolderRewriter basicNew() {
VariableToHolderRewriter newInstance = new VariableToHolderRewriter();
newInstance.initialize();
return newInstance;
}
public VariableToHolderRewriter varName_(final String _aString) {
return this.basicNew().initializeVarName_(_aString);
}
}
static public VariableToHolderRewriter _varName_(Object receiver, final String _aString) {
return factory.varName_(_aString);
}
public VariableToHolderRewriter copy() {
try {
VariableToHolderRewriter _temp1 = (VariableToHolderRewriter) this.clone();
_temp1.postCopy();
return _temp1;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public VariableToHolderRewriter_Factory factory() {
return factory;
}
public VariableToHolderRewriter initializeVarName_(final String _aString) {
_varName = _aString;
this.initialize();
return this;
}
public String varName() {
return _varName;
}
@Override
public Expression visitAssignmentNode_(final AssignmentNode _anObject) {
if (st.gravel.support.jvm.StringExtensions.equals_(_anObject.varName(), _varName)) {
return WriteHolderNode.factory.varName_value_(_varName, ((Expression) VariableToHolderRewriter.this.visit_(_anObject.value())));
}
return AssignmentNode.factory.variable_value_(((VariableNode) this.visit_(_anObject.variable())), ((Expression) this.visit_(_anObject.value())));
}
@Override
public SequenceNode visitSequenceNode_(final SequenceNode _anObject) {
final List<VariableDeclarationNode>[] _found;
Statement[] _stmts;
final VariableDeclarationNode[] _temporaries;
_found = new List[1];
_found[0] = new java.util.ArrayList();
_stmts = st.gravel.support.jvm.ArrayExtensions.collect_(_anObject.statements(), ((st.gravel.support.jvm.Block1<Statement, Statement>) (new st.gravel.support.jvm.Block1<Statement, Statement>() {
@Override
public Statement value_(final Statement _each) {
return (Statement) VariableToHolderRewriter.this.visit_(_each);
}
})));
_temporaries = st.gravel.support.jvm.ArrayExtensions.collect_(_anObject.temporaries(), ((st.gravel.support.jvm.Block1<VariableDeclarationNode, VariableDeclarationNode>) (new st.gravel.support.jvm.Block1<VariableDeclarationNode, VariableDeclarationNode>() {
@Override
public VariableDeclarationNode value_(final VariableDeclarationNode _each) {
VariableDeclarationNode _newDecl;
if (st.gravel.support.jvm.StringExtensions.equals_(_each.name(), _varName)) {
_found[0].add(_each);
_newDecl = HolderDeclarationNode.factory.name_type_(_each.name(), ((TypeNode) VariableToHolderRewriter.this.visit_(_each.type())));
} else {
_newDecl = ((VariableDeclarationNode) VariableToHolderRewriter.this.visit_(_each));
}
return (VariableDeclarationNode) _newDecl;
}
})));
if (_found[0].size() != 0) {
_stmts = st.gravel.support.jvm.ArrayExtensions.copyWithFirst_(_stmts, AssignmentNode.factory.variable_value_(VariableNode.factory.name_(_varName), CreateHolderNode.factory.basicNew()));
}
return SequenceNode.factory.temporaries_statements_(_temporaries, _stmts);
}
@Override
public Expression visitVariableNode_(final VariableNode _anObject) {
if (st.gravel.support.jvm.StringExtensions.equals_(_anObject.name(), _varName)) {
return ReadHolderNode.factory.varName_(_varName);
}
return VariableNode.factory.name_(_anObject.name());
}
}