package org.scribble.ast;
import org.antlr.runtime.tree.CommonTree;
import org.scribble.ast.name.simple.OpNode;
import org.scribble.del.ScribDel;
import org.scribble.main.ScribbleException;
import org.scribble.sesstype.MessageSig;
import org.scribble.visit.AstVisitor;
public class MessageSigNode extends ScribNodeBase implements MessageNode
{
public final OpNode op;
public final PayloadElemList payloads;
public MessageSigNode(CommonTree source, OpNode op, PayloadElemList payload)
{
super(source);
this.op = op;
this.payloads = payload;
}
@Override
public MessageNode project() // Currently outside of visitor/env pattern
{
return AstFactoryImpl.FACTORY.MessageSigNode(this.source, this.op, this.payloads.project()); // Original del not retained by projection
}
@Override
protected MessageSigNode copy()
{
return new MessageSigNode(this.source, this.op, this.payloads);
}
@Override
public MessageSigNode clone()
{
OpNode op = this.op.clone();
PayloadElemList payload = this.payloads.clone();
return AstFactoryImpl.FACTORY.MessageSigNode(this.source, op, payload);
}
public MessageSigNode reconstruct(OpNode op, PayloadElemList payload)
{
ScribDel del = del();
MessageSigNode msn = new MessageSigNode(this.source, op, payload);
msn = (MessageSigNode) msn.del(del);
return msn;
}
@Override
public MessageSigNode visitChildren(AstVisitor nv) throws ScribbleException
{
OpNode op = (OpNode) visitChild(this.op, nv);
PayloadElemList payload = (PayloadElemList) visitChild(this.payloads, nv);
return reconstruct(op, payload);
}
@Override
public boolean isMessageSigNode()
{
return true;
}
// Make a direct scoped version? (taking scope as argument)
@Override
public MessageSig toArg()
{
return new MessageSig(this.op.toName(), this.payloads.toPayload());
}
@Override
public MessageSig toMessage()
{
return toArg();
}
@Override
public String toString()
{
return this.op.toString() + this.payloads.toString();
}
}