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.Statement;
import st.gravel.support.compiler.ast.MessageNode;
import st.gravel.support.compiler.ast.BinaryMessageNode;
import st.gravel.support.compiler.ast.CascadeNode;
import st.gravel.support.compiler.ast.Expression;
import st.gravel.support.compiler.ast.InlineExpressionCollection;
import st.gravel.support.compiler.ast.KeywordMessageNode;
import st.gravel.support.compiler.ast.UnaryMessageNode;
abstract public class MessageSendRewriter extends NodeCopier implements Cloneable {
public static MessageSendRewriter_Factory factory = new MessageSendRewriter_Factory();
Map<st.gravel.core.Symbol, st.gravel.support.jvm.Block1<Statement, MessageNode>> _specialSelectors;
public static class MessageSendRewriter_Factory extends NodeCopier_Factory {
public MessageSendRewriter basicNew() {
throw new RuntimeException("MessageSendRewriter is an abstract class");
}
}
public MessageSendRewriter copy() {
try {
MessageSendRewriter _temp1 = (MessageSendRewriter) this.clone();
_temp1.postCopy();
return _temp1;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public MessageSendRewriter_Factory factory() {
return factory;
}
@Override
public MessageSendRewriter initialize() {
super.initialize();
this.initializeSpecialSelectors();
return this;
}
public abstract MessageSendRewriter initializeSpecialSelectors();
@Override
public Statement visitBinaryMessageNode_(final BinaryMessageNode _anObject) {
final st.gravel.core.Symbol _selector;
final st.gravel.support.jvm.Block1<Statement, MessageNode> _res;
_selector = st.gravel.core.Symbol.value(_anObject.selector());
st.gravel.support.jvm.Block1<Statement, MessageNode> _temp1 = _specialSelectors.get(_selector);
_res = ((st.gravel.support.jvm.Block1<Statement, MessageNode>) _temp1);
if (_res != null) {
final Statement _trans;
_trans = _res.value_(_anObject);
if (_trans != null) {
return _trans;
}
}
return super.visitBinaryMessageNode_(_anObject);
}
@Override
public Expression visitCascadeNode_(final CascadeNode _anObject) {
final Expression[] _expressions;
_expressions = st.gravel.support.jvm.ArrayExtensions.collect_(_anObject.messages(), ((st.gravel.support.jvm.Block1<Expression, MessageNode>) (new st.gravel.support.jvm.Block1<Expression, MessageNode>() {
@Override
public Expression value_(final MessageNode _each) {
return (Expression) MessageSendRewriter.this.visit_(_each);
}
})));
if (st.gravel.support.jvm.ArrayExtensions.anySatisfy_(_expressions, new st.gravel.support.jvm.Predicate1<Expression>() {
@Override
public boolean value_(final Expression _each) {
return !_each.isMessageNode();
}
})) {
return InlineExpressionCollection.factory.expressions_(_expressions);
}
return CascadeNode.factory.messages_(st.gravel.support.jvm.ArrayExtensions.collect_(_expressions, ((st.gravel.support.jvm.Block1<MessageNode, Expression>) (new st.gravel.support.jvm.Block1<MessageNode, Expression>() {
@Override
public MessageNode value_(final Expression _each) {
return (MessageNode) _each;
}
}))));
}
@Override
public Statement visitKeywordMessageNode_(final KeywordMessageNode _anObject) {
final st.gravel.core.Symbol _selector;
final st.gravel.support.jvm.Block1<Statement, MessageNode> _res;
_selector = st.gravel.core.Symbol.value(_anObject.selector());
st.gravel.support.jvm.Block1<Statement, MessageNode> _temp1 = _specialSelectors.get(_selector);
_res = ((st.gravel.support.jvm.Block1<Statement, MessageNode>) _temp1);
if (_res != null) {
final Statement _trans;
_trans = _res.value_(_anObject);
if (_trans != null) {
return _trans;
}
}
return super.visitKeywordMessageNode_(_anObject);
}
@Override
public Statement visitUnaryMessageNode_(final UnaryMessageNode _anObject) {
final st.gravel.core.Symbol _selector;
final st.gravel.support.jvm.Block1<Statement, MessageNode> _res;
_selector = st.gravel.core.Symbol.value(_anObject.selector());
st.gravel.support.jvm.Block1<Statement, MessageNode> _temp1 = _specialSelectors.get(_selector);
_res = ((st.gravel.support.jvm.Block1<Statement, MessageNode>) _temp1);
if (_res != null) {
final Statement _trans;
_trans = _res.value_(_anObject);
if (_trans != null) {
return _trans;
}
}
return super.visitUnaryMessageNode_(_anObject);
}
}