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