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.visit.AstVisitor; public abstract class Choice<K extends ProtocolKind> extends CompoundInteractionNode<K> { public final RoleNode subj; private final List<? extends ProtocolBlock<K>> blocks; // Factor up? And specialise to singleton for Recursion/Interruptible? Maybe too artificial -- could separate unaryblocked and multiblocked compound ops? protected Choice(CommonTree source, RoleNode subj, List<? extends ProtocolBlock<K>> blocks) { super(source); this.subj = subj; this.blocks = new LinkedList<>(blocks); } public abstract Choice<K> reconstruct(RoleNode subj, List<? extends ProtocolBlock<K>> blocks); @Override public Choice<K> visitChildren(AstVisitor nv) throws ScribbleException { RoleNode subj = (RoleNode) visitChild(this.subj, nv); List<? extends ProtocolBlock<K>> blocks = visitChildListWithClassEqualityCheck(this, this.blocks, nv); return reconstruct(subj, blocks); } public List<? extends ProtocolBlock<K>> getBlocks() { return Collections.unmodifiableList(this.blocks); } @Override public String toString() { String sep = " " + Constants.OR_KW + " "; return Constants.CHOICE_KW + " " + Constants.AT_KW + " " + this.subj + " " + this.blocks.stream().map((b) -> b.toString()).collect(Collectors.joining(sep)); } /*@Override public Map<Role, MessageId> getEnablingMessages() { }*/ }