package org.scribble.del; import org.scribble.ast.ProtocolDef; import org.scribble.ast.ScribNode; import org.scribble.main.ScribbleException; import org.scribble.sesstype.kind.ProtocolKind; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.RecRemover; import org.scribble.visit.util.RecVarCollector; public abstract class ProtocolDefDel extends ScribDelBase { protected ProtocolDef<? extends ProtocolKind> inlined = null; protected abstract ProtocolDefDel copy(); @Override public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException { ScribDelBase.pushVisitorEnv(this, inl); } public ProtocolDef<?> getInlinedProtocolDef() { return this.inlined; } public ProtocolDefDel setInlinedProtocolDef(ProtocolDef<?> inlined) { ProtocolDefDel copy = copy(); copy.inlined = inlined; return copy; } public void enterRecRemoval(ScribNode parent, ScribNode child, RecRemover rem) { super.enterRecRemoval(parent, child, rem); RecVarCollector rvc = new RecVarCollector(rem.job); try { this.inlined.accept(rvc); // RecVarCollector not an InlinedProtocolVistor -- do simple visiting directly on inlined } catch (ScribbleException e) { throw new RuntimeException(e); } rem.setToRemove(rvc.getNames()); } }