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.NodeCopierWithLocals;
import st.gravel.support.compiler.ast.NodeCopierWithLocals.NodeCopierWithLocals_Factory;
import st.gravel.support.compiler.ast.Node;
import java.util.Set;
import st.gravel.support.compiler.ast.Expression;
import st.gravel.support.compiler.ast.LiteralSendInliner;
import st.gravel.support.compiler.ast.LocalDefinedVariableRenamer;
import st.gravel.support.compiler.ast.FieldReadNode;
import st.gravel.support.compiler.ast.GlobalReadNode;
import st.gravel.support.compiler.ast.LocalReadNode;
import st.gravel.support.compiler.ast.SelfNode;
import st.gravel.support.compiler.ast.SuperNode;
import st.gravel.support.compiler.ast.VariableNode;
import java.util.HashSet;
public class VariableNodeReplacer extends NodeCopierWithLocals implements Cloneable {
public static VariableNodeReplacer_Factory factory = new VariableNodeReplacer_Factory();
st.gravel.support.jvm.Block1<Expression, java.util.Set<String>> _replacementBlock;
String _varName;
public static class VariableNodeReplacer_Factory extends NodeCopierWithLocals_Factory {
public VariableNodeReplacer basicNew() {
VariableNodeReplacer newInstance = new VariableNodeReplacer();
newInstance.initialize();
return newInstance;
}
public Expression for_renameAll_in_(final Node _aNode, final java.util.Set<String> _localNames, final Expression _replacementNode) {
final LiteralSendInliner _lsi;
Expression _res;
_lsi = LiteralSendInliner.factory.basicNew();
_lsi.initializeRoot_(_aNode);
_lsi.addUsedNode_(_replacementNode);
_res = _replacementNode;
for (final String _oldName : _localNames) {
final String _newName;
_newName = _lsi.newTempName_(_oldName);
_res = ((Expression) LocalDefinedVariableRenamer.factory.in_rename_to_(_res, _oldName, _newName));
}
return _res;
}
public Node in_replace_with_(final Node _aNode, final String _varName, final Expression _replacementNode) {
return this.varName_replacementBlock_(_varName, ((st.gravel.support.jvm.Block1<Expression, java.util.Set<String>>) (new st.gravel.support.jvm.Block1<Expression, java.util.Set<String>>() {
@Override
public Expression value_(final java.util.Set<String> _localNames) {
return (Expression) VariableNodeReplacer_Factory.this.for_renameAll_in_(_aNode, _localNames, _replacementNode);
}
}))).visit_(_aNode);
}
public VariableNodeReplacer varName_replacementBlock_(final String _varName, final st.gravel.support.jvm.Block1<Expression, java.util.Set<String>> _aBlock) {
return ((VariableNodeReplacer) this.basicNew().initializeVarName_replacementBlock_(_varName, _aBlock));
}
}
static public Expression _for_renameAll_in_(Object receiver, final Node _aNode, final java.util.Set<String> _localNames, final Expression _replacementNode) {
return factory.for_renameAll_in_(_aNode, _localNames, _replacementNode);
}
static public Node _in_replace_with_(Object receiver, final Node _aNode, final String _varName, final Expression _replacementNode) {
return factory.in_replace_with_(_aNode, _varName, _replacementNode);
}
static public VariableNodeReplacer _varName_replacementBlock_(Object receiver, final String _varName, final st.gravel.support.jvm.Block1<Expression, java.util.Set<String>> _aBlock) {
return factory.varName_replacementBlock_(_varName, _aBlock);
}
@Override
public VariableNodeReplacer addLocalName_(final String _name) {
_localNames.add(_name);
return this;
}
public Expression buildReplacement() {
return _replacementBlock.value_(_localNames);
}
public VariableNodeReplacer copy() {
try {
VariableNodeReplacer _temp1 = (VariableNodeReplacer) this.clone();
_temp1.postCopy();
return _temp1;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public VariableNodeReplacer_Factory factory() {
return factory;
}
@Override
public VariableNodeReplacer initialize() {
super.initialize();
_localNames = new java.util.HashSet();
return this;
}
public VariableNodeReplacer initializeVarName_replacementBlock_(final String _aString, final st.gravel.support.jvm.Block1<Expression, java.util.Set<String>> _aBlock) {
_varName = _aString;
_replacementBlock = _aBlock;
this.initialize();
return this;
}
@Override
public VariableNodeReplacer postCopy() {
super.postCopy();
_localNames = st.gravel.support.jvm.SetExtensions.copy(_localNames);
return this;
}
@Override
public VariableNodeReplacer subconverter() {
return this.copy();
}
public String varName() {
return _varName;
}
@Override
public Expression visitFieldReadNode_(final FieldReadNode _anObject) {
if (st.gravel.support.jvm.StringExtensions.equals_(_anObject.name(), _varName)) {
return VariableNodeReplacer.this.buildReplacement();
}
return super.visitFieldReadNode_(_anObject);
}
@Override
public Expression visitGlobalReadNode_(final GlobalReadNode _anObject) {
if (st.gravel.support.jvm.StringExtensions.equals_(_anObject.name(), _varName)) {
return VariableNodeReplacer.this.buildReplacement();
}
return super.visitGlobalReadNode_(_anObject);
}
@Override
public Expression visitLocalReadNode_(final LocalReadNode _anObject) {
if (st.gravel.support.jvm.StringExtensions.equals_(_anObject.name(), _varName)) {
return VariableNodeReplacer.this.buildReplacement();
}
return super.visitLocalReadNode_(_anObject);
}
@Override
public Expression visitSelfNode_(final SelfNode _anObject) {
if (st.gravel.support.jvm.StringExtensions.equals_(_varName, "self")) {
return VariableNodeReplacer.this.buildReplacement();
}
return _anObject;
}
@Override
public SuperNode visitSuperNode_(final SuperNode _anObject) {
if (st.gravel.support.jvm.StringExtensions.equals_(_varName, "self")) {
throw new RuntimeException("Cant rename super");
}
return super.visitSuperNode_(_anObject);
}
@Override
public Expression visitVariableNode_(final VariableNode _anObject) {
if (st.gravel.support.jvm.StringExtensions.equals_(_anObject.name(), _varName)) {
return VariableNodeReplacer.this.buildReplacement();
}
return super.visitVariableNode_(_anObject);
}
}