package org.scribble.ast; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; 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.sesstype.name.Role; import org.scribble.visit.AstVisitor; public abstract class MessageTransfer<K extends ProtocolKind> extends SimpleInteractionNode<K> { public final RoleNode src; public final MessageNode msg; // FIXME: ambig may get resolved to an unexpected kind, e.g. DataTypeNode (cf. DoArg, PayloadElem wrappers) private final List<RoleNode> dests; protected MessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List<RoleNode> dests) { super(source); this.src = src; this.msg = msg; this.dests = new LinkedList<>(dests); } public abstract MessageTransfer<K> reconstruct(RoleNode src, MessageNode msg, List<RoleNode> dests); @Override public MessageTransfer<K> visitChildren(AstVisitor nv) throws ScribbleException { RoleNode src = (RoleNode) visitChild(this.src, nv); MessageNode msg = (MessageNode) visitChild(this.msg, nv); List<RoleNode> dests = visitChildListWithClassEqualityCheck(this, this.dests, nv); return reconstruct(src, msg, dests); } public List<RoleNode> getDestinations() { return Collections.unmodifiableList(this.dests); } public List<Role> getDestinationRoles() { return this.dests.stream().map((rn) -> rn.toName()).collect(Collectors.toList()); } @Override public abstract String toString(); }