package org.scribble.ast; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.main.ScribbleException; import org.scribble.sesstype.kind.ProtocolKind; import org.scribble.visit.AstVisitor; // FIXME: factor with MessageTransfer public abstract class ConnectionAction<K extends ProtocolKind> extends SimpleInteractionNode<K> { public final RoleNode src; public final MessageNode msg; public final RoleNode dest; protected ConnectionAction(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) //protected ConnectionAction(RoleNode src, RoleNode dest) { super(source); this.src = src; this.msg = msg; this.dest = dest; } public abstract ConnectionAction<K> reconstruct(RoleNode src, MessageNode msg, RoleNode dest); //public abstract ConnectionAction<K> reconstruct(RoleNode src, RoleNode dest); @Override public ConnectionAction<K> visitChildren(AstVisitor nv) throws ScribbleException { RoleNode src = (RoleNode) visitChild(this.src, nv); MessageNode msg = (MessageNode) visitChild(this.msg, nv); RoleNode dest = (RoleNode) visitChild(this.dest, nv); return reconstruct(src, msg, dest); //return reconstruct(src, dest); } @Override public abstract String toString(); protected boolean isUnitMessage() { if (!this.msg.isMessageSigNode()) { return false; } MessageSigNode msn = (MessageSigNode) this.msg; return msn.op.isEmpty() && msn.payloads.isEmpty(); } }