package org.scribble.del.global; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GWrap; import org.scribble.ast.local.LNode; import org.scribble.del.ConnectionActionDel; import org.scribble.main.ScribbleException; import org.scribble.sesstype.name.Role; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; import org.scribble.visit.wf.WFChoiceChecker; import org.scribble.visit.wf.env.WFChoiceEnv; // FIXME: make WrapDel (cf., G/LMessageTransferDel) public class GWrapDel extends ConnectionActionDel implements GSimpleInteractionNodeDel { public GWrapDel() { } @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException { GWrap gw = (GWrap) visited; /*Role src = gw.src.toName(); Role dest = gw.dest.toName();*/ return gw; } @Override public GWrap leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException { GWrap gw = (GWrap) visited; Role src = gw.src.toName(); Role dest = gw.dest.toName(); if (!checker.peekEnv().isEnabled(src)) { throw new ScribbleException(gw.src.getSource(), "Role not enabled: " + src); } if (!checker.peekEnv().isEnabled(dest)) { throw new ScribbleException(gw.dest.getSource(), "Role not enabled: " + dest); } //Message msg = gw.msg.toMessage(); // Unit message if (src.equals(dest)) { throw new ScribbleException(gw.getSource(), "[TODO] Self connections not supported: " + gw); } WFChoiceEnv env = checker.popEnv(); if (!env.isConnected(src, dest)) { throw new ScribbleException(gw.getSource(), "Roles not (necessarily) connected: " + src + ", " + dest); } //env = env.addMessage(src, dest, msg); /*env = env .connect(src, dest) .addMessage(src, dest, new MessageSig(Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD));*/ checker.pushEnv(env); return gw; } @Override public ScribNode leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException //throws ScribbleException { GWrap gw = (GWrap) visited; Role self = proj.peekSelf(); LNode projection = gw.project(self); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GWrap) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gw); } }