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