package org.scribble.del.global; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GConnect; import org.scribble.ast.local.LNode; import org.scribble.del.ConnectionActionDel; import org.scribble.main.ScribbleException; import org.scribble.sesstype.Message; 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; public class GConnectDel extends ConnectionActionDel implements GSimpleInteractionNodeDel { public GConnectDel() { } @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException { GConnect gc = (GConnect) visited; /*Role src = gc.src.toName(); Role dest = gc.dest.toName();*/ return gc; } @Override public GConnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException { GConnect gc = (GConnect) visited; Role src = gc.src.toName(); if (!checker.peekEnv().isEnabled(src)) { throw new ScribbleException(gc.src.getSource(), "Role not enabled: " + src); } Message msg = gc.msg.toMessage(); WFChoiceEnv env = checker.popEnv(); //for (Role dest : gc.getDestinationRoles()) Role dest = gc.dest.toName(); { if (src.equals(dest)) { throw new ScribbleException(gc.getSource(), "[TODO] Self connections not supported: " + gc); } if (env.isConnected(src, dest)) { throw new ScribbleException(gc.getSource(), "Roles (possibly) already connected: " + src + ", " + dest); } env = env.connect(src, dest).addMessage(src, dest, msg); /*env = env .connect(src, dest) .addMessage(src, dest, new MessageSig(Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD));*/ } checker.pushEnv(env); return gc; } @Override public ScribNode leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException //throws ScribbleException { GConnect gc = (GConnect) visited; Role self = proj.peekSelf(); LNode projection = gc.project(self); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GConnect) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gc); } /*// Duplicated from GMessageTransferDel @Override public ScribNode leaveF17Parsing(ScribNode parent, ScribNode child, F17Parser parser, ScribNode visited) throws ScribbleException { F17ParserEnv env = parser.peekEnv(); if (env.isUnguarded()) { parser.popEnv(); parser.pushEnv(new F17ParserEnv()); // Maybe make "setGuarded" method } return super.leaveF17Parsing(parent, child, parser, visited); }*/ }