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.MethodNode; import st.gravel.support.compiler.ast.BlockNode; import st.gravel.support.compiler.ast.NonLocalReturnNode; import st.gravel.support.compiler.ast.Statement; import st.gravel.support.compiler.ast.ReturnNode; import st.gravel.support.compiler.ast.Expression; public class NonLocalReturnRewriter extends NodeCopier implements Cloneable { public static NonLocalReturnRewriter_Factory factory = new NonLocalReturnRewriter_Factory(); boolean _isInBlockNode; String _nlrMarker; String _oldNlrMarker; public static class NonLocalReturnRewriter_Factory extends NodeCopier_Factory { public NonLocalReturnRewriter basicNew() { NonLocalReturnRewriter newInstance = new NonLocalReturnRewriter(); newInstance.initialize(); return newInstance; } public NonLocalReturnRewriter nlrMarker_(final String _aString) { return this.basicNew().initializeNlrMarker_(_aString); } } static public NonLocalReturnRewriter _nlrMarker_(Object receiver, final String _aString) { return factory.nlrMarker_(_aString); } public NonLocalReturnRewriter copy() { try { NonLocalReturnRewriter _temp1 = (NonLocalReturnRewriter) this.clone(); _temp1.postCopy(); return _temp1; } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } } public NonLocalReturnRewriter_Factory factory() { return factory; } @Override public NonLocalReturnRewriter initialize() { super.initialize(); _isInBlockNode = false; return this; } public NonLocalReturnRewriter initializeNlrMarker_(final String _aString) { _nlrMarker = _aString; this.initialize(); return this; } public String nlrMarker() { return _nlrMarker; } @Override public String produceNlrMarkerDefinition_for_(final String _aString, final MethodNode _aMethodNode) { _oldNlrMarker = _aString; return _aMethodNode.hasNonLocalReturns() ? _nlrMarker : null; } @Override public BlockNode visitBlockNode_(final BlockNode _anObject) { final boolean _old; final BlockNode _bn; _old = _isInBlockNode; _isInBlockNode = true; _bn = super.visitBlockNode_(_anObject); _isInBlockNode = _old; return _bn; } @Override public Statement visitNonLocalReturnNode_(final NonLocalReturnNode _anObject) { if (st.gravel.support.jvm.StringExtensions.equals_(_oldNlrMarker, _anObject.marker())) { if (!_isInBlockNode) { return ReturnNode.factory.value_(((Expression) NonLocalReturnRewriter.this.visit_(_anObject.value()))); } return NonLocalReturnNode.factory.marker_value_(_nlrMarker, ((Expression) NonLocalReturnRewriter.this.visit_(_anObject.value()))); } return NonLocalReturnNode.factory.marker_value_(_anObject.marker(), ((Expression) this.visit_(_anObject.value()))); } @Override public Statement visitReturnNode_(final ReturnNode _aReturnNode) { if (_isInBlockNode) { return NonLocalReturnNode.factory.marker_value_(_nlrMarker, ((Expression) NonLocalReturnRewriter.this.visit_(_aReturnNode.value()))); } return super.visitReturnNode_(_aReturnNode); } }