package org.scribble.del;
import org.scribble.ast.MessageSigNode;
import org.scribble.ast.MessageTransfer;
import org.scribble.ast.PayloadElem;
import org.scribble.ast.ScribNode;
import org.scribble.ast.global.GDelegationElem;
import org.scribble.del.global.GDelegationElemDel;
import org.scribble.main.ScribbleException;
import org.scribble.sesstype.name.MessageId;
import org.scribble.visit.InlinedProtocolUnfolder;
import org.scribble.visit.ProtocolDefInliner;
import org.scribble.visit.context.ProtocolDeclContextBuilder;
import org.scribble.visit.env.UnfoldingEnv;
import org.scribble.visit.util.MessageIdCollector;
import org.scribble.visit.util.RoleCollector;
public abstract class MessageTransferDel extends SimpleInteractionNodeDel
{
public MessageTransferDel()
{
}
@Override
public MessageTransfer<?> leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException
{
MessageTransfer<?> lr = (MessageTransfer<?>) visited;
MessageTransfer<?> inlined = (MessageTransfer<?>) lr.clone();
inl.pushEnv(inl.popEnv().setTranslation(inlined));
return (MessageTransfer<?>) super.leaveProtocolInlining(parent, child, inl, lr);
}
/*@Override
public void enterChoiceUnguardedSubprotocolCheck(ScribNode parent, ScribNode child, ChoiceUnguardedSubprotocolChecker checker) throws ScribbleException
{
ChoiceUnguardedSubprotocolEnv env = checker.popEnv();
env = env.disablePrune();
checker.pushEnv(env);
}*/
@Override
public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribbleException
{
UnfoldingEnv env = unf.popEnv();
env = env.disableUnfold();
unf.pushEnv(env);
}
@Override
public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, RoleCollector coll, ScribNode visited)
{
MessageTransfer<?> mt = (MessageTransfer<?>) visited;
coll.addName(mt.src.toName());
mt.getDestinationRoles().stream().forEach((rd) -> coll.addName(rd));
return visited;
}
@Override
public ScribNode leaveMessageIdCollection(ScribNode parent, ScribNode child, MessageIdCollector coll, ScribNode visited)
{
MessageTransfer<?> mt = (MessageTransfer<?>) visited;
if (mt.msg.isMessageSigNode() || mt.msg.isMessageSigNameNode())
{
coll.addName((MessageId<?>) mt.msg.toMessage().getId());
}
else
{
throw new RuntimeException("Shouldn't get in here: " + mt.msg);
}
return visited;
}
@Override
public MessageTransfer<?> leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) throws ScribbleException
{
MessageTransfer<?> mt = (MessageTransfer<?>) visited;
if (mt.msg.isMessageSigNode())
{
for (PayloadElem<?> pe : ((MessageSigNode) mt.msg).payloads.getElements())
{
if (pe.isGlobalDelegationElem()) // FIXME: should always be GMessageTransfer
{
((GDelegationElemDel) pe.del()).leaveMessageTransferInProtocolDeclContextBuilding(mt, (GDelegationElem) pe, builder);
}
}
}
return mt;
}
/*@Override
public ScribNode leaveEnablingMessageCollection(ScribNode parent, ScribNode child, EnablingMessageCollector coll, ScribNode visited)
{
MessageTransfer<?> mt = (MessageTransfer<?>) visited;
coll.addEnabling(mt.src.toName(), mt.getDestinations().get(0).toName(), mt.msg.toMessage().getId()); // FIXME: multicast
return visited;
}*/
}