package org.scribble.del;
import org.scribble.ast.ScribNode;
import org.scribble.visit.EnvVisitor;
import org.scribble.visit.env.Env;
// Mutable for pass-specific Envs (by visitors)
public abstract class ScribDelBase implements ScribDel
{
private Env<?> env;
public ScribDelBase()
{
}
@Override
public Env<?> env()
{
return this.env;
}
// "setEnv" rather than "env" as a non-defensive setter (cf. ModelNodeBase#del)
@Override
//protected void setEnv(Env env)
public void setEnv(Env<?> env)
{
this.env = env;
}
public static <T extends Env<?>> void pushVisitorEnv(ScribDel del, EnvVisitor<T> ev)
{
T env = castEnv(ev, ev.peekEnv().enterContext()); // By default: copy
ev.pushEnv(env);
}
public static <T1 extends Env<?>, T2 extends ScribNode>
T2 popAndSetVisitorEnv(ScribDel del, EnvVisitor<T1> ev, T2 visited)
{
// No merge here: merging of child contexts into parent context is handled "manually" for each pass and (compound) interaction node as needed (e.g. WF-choice and reachability)
T1 env = ev.popEnv();
((ScribDelBase) del).setEnv(env);
return visited;
}
private static <T extends Env<?>> T castEnv(EnvVisitor<T> ev, Env<?> env)
{
@SuppressWarnings("unchecked")
T tmp = (T) env;
return tmp;
}
}