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 java.util.Map;
import st.gravel.support.compiler.ast.VariableScopeAnalyzerState;
import java.util.HashMap;
import st.gravel.support.compiler.ast.AssignmentNode;
import st.gravel.support.compiler.ast.Expression;
import st.gravel.support.compiler.ast.VariableNode;
import st.gravel.support.compiler.ast.BlockNode;
import st.gravel.support.compiler.ast.NonLocalTempWritesToHolderConverter;
import st.gravel.support.compiler.ast.VariableDeclarationNode;
import st.gravel.support.compiler.ast.SequenceNode;
import st.gravel.support.compiler.ast.TypeNode;
import st.gravel.support.compiler.ast.VariableScopeAnalyzerStateDefined;
import st.gravel.support.compiler.ast.Statement;
import java.util.Map;
import java.util.Map.*;
import st.gravel.support.compiler.ast.VariableToHolderRewriter;
abstract public class NonLocalTempAccessToHolderConverter extends NodeCopier implements Cloneable {
public static NonLocalTempAccessToHolderConverter_Factory factory = new NonLocalTempAccessToHolderConverter_Factory();
NonLocalTempAccessToHolderConverter _parent;
Map<String, VariableScopeAnalyzerState> _temps;
public static class NonLocalTempAccessToHolderConverter_Factory extends NodeCopier_Factory {
public NonLocalTempAccessToHolderConverter basicNew() {
throw new RuntimeException("NonLocalTempAccessToHolderConverter is an abstract class");
}
public NonLocalTempAccessToHolderConverter parent_(final NonLocalTempAccessToHolderConverter _aVariableScopeAnalyzer) {
return ((NonLocalTempAccessToHolderConverter) this.basicNew().initializeParent_(_aVariableScopeAnalyzer));
}
}
static public NonLocalTempAccessToHolderConverter _parent_(Object receiver, final NonLocalTempAccessToHolderConverter _aVariableScopeAnalyzer) {
return factory.parent_(_aVariableScopeAnalyzer);
}
public NonLocalTempAccessToHolderConverter addBlockVariableRead_(final String _aString) {
if (!_temps.containsKey(_aString)) {
if (_parent == null) {
return NonLocalTempAccessToHolderConverter.this;
}
_parent.addBlockVariableRead_(_aString);
return NonLocalTempAccessToHolderConverter.this;
}
_temps.put(_aString, _temps.get(_aString).withBlockRead());
return this;
}
public NonLocalTempAccessToHolderConverter addBlockVariableWrite_(final String _aString) {
if (!_temps.containsKey(_aString)) {
if (_parent == null) {
return NonLocalTempAccessToHolderConverter.this;
}
_parent.addBlockVariableWrite_(_aString);
return NonLocalTempAccessToHolderConverter.this;
}
_temps.put(_aString, _temps.get(_aString).withBlockWrite());
return this;
}
public NonLocalTempAccessToHolderConverter addVariableRead_(final String _aString) {
if (!_temps.containsKey(_aString)) {
if (_parent == null) {
return NonLocalTempAccessToHolderConverter.this;
}
_parent.addBlockVariableRead_(_aString);
return NonLocalTempAccessToHolderConverter.this;
}
_temps.put(_aString, _temps.get(_aString).withLocalRead());
return this;
}
public NonLocalTempAccessToHolderConverter addVariableWrite_(final String _aString) {
if (!_temps.containsKey(_aString)) {
if (_parent == null) {
return NonLocalTempAccessToHolderConverter.this;
}
_parent.addBlockVariableWrite_(_aString);
return NonLocalTempAccessToHolderConverter.this;
}
_temps.put(_aString, _temps.get(_aString).withLocalWrite());
return this;
}
public NonLocalTempAccessToHolderConverter copy() {
try {
NonLocalTempAccessToHolderConverter _temp1 = (NonLocalTempAccessToHolderConverter) this.clone();
_temp1.postCopy();
return _temp1;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public NonLocalTempAccessToHolderConverter_Factory factory() {
return factory;
}
@Override
public NonLocalTempAccessToHolderConverter initialize() {
super.initialize();
_temps = new java.util.HashMap<String, VariableScopeAnalyzerState>();
return this;
}
public NonLocalTempAccessToHolderConverter initializeParent_(final NonLocalTempAccessToHolderConverter _aVariableScopeAnalyzer) {
_parent = _aVariableScopeAnalyzer;
this.initialize();
return this;
}
public abstract boolean needsRewrite_(final VariableScopeAnalyzerState _state);
public NonLocalTempAccessToHolderConverter parent() {
return _parent;
}
@Override
public Expression visitAssignmentNode_(final AssignmentNode _anObject) {
this.addVariableWrite_(_anObject.variable().name());
return AssignmentNode.factory.variable_value_(VariableNode.factory.name_(_anObject.variable().name()), ((Expression) this.visit_(_anObject.value())));
}
@Override
public BlockNode visitBlockNode_(final BlockNode _anObject) {
final NonLocalTempWritesToHolderConverter[] _sub;
_sub = new NonLocalTempWritesToHolderConverter[1];
_sub[0] = NonLocalTempWritesToHolderConverter.factory.parent_(this);
return BlockNode.factory.arguments_body_returnType_(st.gravel.support.jvm.ArrayExtensions.collect_(_anObject.arguments(), ((st.gravel.support.jvm.Block1<VariableDeclarationNode, VariableDeclarationNode>) (new st.gravel.support.jvm.Block1<VariableDeclarationNode, VariableDeclarationNode>() {
@Override
public VariableDeclarationNode value_(final VariableDeclarationNode _each) {
return (VariableDeclarationNode) _sub[0].visit_(_each);
}
}))), ((SequenceNode) _sub[0].visit_(_anObject.body())), ((TypeNode) _sub[0].visit_(_anObject.returnType())));
}
@Override
public SequenceNode visitSequenceNode_(final SequenceNode _anObject) {
final SequenceNode[] _node;
_node = new SequenceNode[1];
_node[0] = SequenceNode.factory.temporaries_statements_(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) {
_temps.put(_each.name(), VariableScopeAnalyzerStateDefined.factory.basicNew());
return (VariableDeclarationNode) NonLocalTempAccessToHolderConverter.this.visit_(_each);
}
}))), 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) NonLocalTempAccessToHolderConverter.this.visit_(_each);
}
}))));
for (final Map.Entry<String, VariableScopeAnalyzerState> _temp1 : _temps.entrySet()) {
String _varName = _temp1.getKey();
VariableScopeAnalyzerState _state = _temp1.getValue();
if (NonLocalTempAccessToHolderConverter.this.needsRewrite_(_state)) {
_node[0] = ((SequenceNode) VariableToHolderRewriter.factory.varName_(_varName).visit_(_node[0]));
}
}
return _node[0];
}
@Override
public Expression visitVariableNode_(final VariableNode _anObject) {
this.addVariableRead_(_anObject.name());
return VariableNode.factory.name_(_anObject.name());
}
}