package jcircus.newutil;
import java.util.List;
import net.sourceforge.czt.circus.ast.Action1;
import net.sourceforge.czt.circus.ast.Action2;
import net.sourceforge.czt.circus.ast.ActionList;
import net.sourceforge.czt.circus.ast.AssignmentCommand;
import net.sourceforge.czt.circus.ast.BasicAction;
import net.sourceforge.czt.circus.ast.CallAction;
import net.sourceforge.czt.circus.ast.CircusAction;
import net.sourceforge.czt.circus.ast.CircusActionList;
import net.sourceforge.czt.circus.ast.GuardedAction;
import net.sourceforge.czt.circus.ast.IfGuardedCommand;
import net.sourceforge.czt.circus.ast.MuAction;
import net.sourceforge.czt.circus.ast.PrefixingAction;
import net.sourceforge.czt.circus.ast.VarDeclCommand;
import jcircus.environment.NameTypeEnv;
public class MuUtil {
public static NameTypeEnv searchNameTypeEnvAnnForMu (String callname, CircusAction action) {
if (action instanceof Action2) {
CircusAction left = ((Action2)action).getLeftAction();
CircusAction right = ((Action2)action).getRightAction();
NameTypeEnv nteleft = searchNameTypeEnvAnnForMu (callname, left);
NameTypeEnv nteright = searchNameTypeEnvAnnForMu (callname, right);
nteleft.putAll(nteright);
return nteleft;
}
else if (action instanceof MuAction) {
String muname = ((MuAction)action).getZName().toString();
if (muname.equals (callname)) {
return action.getAnn(NameTypeEnv.class);
}
else {
return searchNameTypeEnvAnnForMu (callname, ((MuAction)action).getCircusAction());
}
}
else if (action instanceof PrefixingAction) {
return searchNameTypeEnvAnnForMu (callname, ((PrefixingAction)action).getCircusAction());
}
else if (action instanceof Action1) {
return searchNameTypeEnvAnnForMu (callname, ((Action1)action).getCircusAction());
}
else if (action instanceof AssignmentCommand) {
return new NameTypeEnv ();
}
else if (action instanceof IfGuardedCommand) {
CircusActionList actions = ((IfGuardedCommand)action).getGuardedActionList();
NameTypeEnv nte = new NameTypeEnv ();
int size = actions.size();
for (int i = 0; i < size; i++) {
GuardedAction ga = (GuardedAction) actions.get(i);
if (nte.iteratorSize() == 0)
nte = searchNameTypeEnvAnnForMu (callname, ga);
}
return nte;
}
else if (action instanceof VarDeclCommand) {
return searchNameTypeEnvAnnForMu (callname, ((VarDeclCommand)action).getCircusAction());
}
else if (action instanceof CallAction) {
return new NameTypeEnv ();
}
else if (action instanceof BasicAction) {
return new NameTypeEnv ();
}
else {
ExceptionUtil.throwImplementationException("MuUtil.searchNameTypeEnvAnnForMu", action.getClass());
return new NameTypeEnv ();
}
}
}