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.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.CircusCommand;
import net.sourceforge.czt.circus.ast.ExtChoiceAction;
import net.sourceforge.czt.circus.ast.GuardedAction;
import net.sourceforge.czt.circus.ast.IfGuardedCommand;
import net.sourceforge.czt.circus.ast.VarDeclCommand;
import net.sourceforge.czt.circus.util.Factory;
import net.sourceforge.czt.z.ast.Pred;
public class ChoiceUtil {
public static CircusAction replaceGuardsOnExtChoice (CircusAction action) {
Factory f = new Factory ();
FactoryUtil fu = new FactoryUtil ();
if (action instanceof GuardedAction) {
CircusAction resaction = ((GuardedAction)action).getCircusAction();
Pred respred = ((GuardedAction)action).getPred();
if (resaction instanceof ExtChoiceAction) {
CircusAction left = fu.createCircusAction (replaceGuardsOnExtChoice(((ExtChoiceAction)resaction).getLeftAction()));
CircusAction right = fu.createCircusAction (replaceGuardsOnExtChoice(((ExtChoiceAction)resaction).getRightAction()));
GuardedAction gleft = f.createGuardedAction();
GuardedAction gright = f.createGuardedAction();
gleft.setPred(fu.createPred (respred));
gright.setPred(fu.createPred (respred));
gleft.setCircusAction(left);
gright.setCircusAction(right);
ExtChoiceAction eca = f.createExtChoiceAction ();
eca.setLeftAction (gleft);
eca.setRightAction (gright);
return eca;
}
else {
Pred pred = ((GuardedAction)action).getPred();
GuardedAction ga = f.createGuardedAction ();
ga.setPred(fu.createPred(pred));
ga.setCircusAction(fu.createCircusAction (replaceGuardsOnExtChoice(resaction)));
return ga;
}
}
else if (action instanceof Action1) {
CircusAction returnedAction = fu.createCircusAction(((Action1)action).getCircusAction());
((Action1)action).setCircusAction(replaceGuardsOnExtChoice(returnedAction));
return action;
}
else if (action instanceof Action2) {
((Action2)action).setLeftAction(replaceGuardsOnExtChoice (fu.createCircusAction(((Action2)action).getLeftAction())));
((Action2)action).setRightAction(replaceGuardsOnExtChoice (fu.createCircusAction(((Action2)action).getRightAction())));
return action;
}
else if (action instanceof CircusCommand) {
if (action instanceof AssignmentCommand) {
return action;
}
else if (action instanceof IfGuardedCommand) {
CircusActionList cal = ((IfGuardedCommand)action).getGuardedActionList();
int size = cal.size();
for (int i = 0; i < size; i++) {
GuardedAction ga = (GuardedAction)cal.get(i);
ga.setCircusAction(replaceGuardsOnExtChoice (fu.createCircusAction(ga.getCircusAction())));
}
return action;
}
else if (action instanceof VarDeclCommand) {
((VarDeclCommand)action).setCircusAction(replaceGuardsOnExtChoice(((VarDeclCommand)action).getCircusAction()));
return action;
}
else {
ExceptionUtil.throwImplementationException("ChoiceUtil.replaceGuardsOnExtChoice", action.getClass());
return action;
}
}
else if (action instanceof BasicAction) {
return action;
}
else if (action instanceof CallAction) {
return action;
}
else {
ExceptionUtil.throwImplementationException("ChoiceUtil.replaceGuardsOnExtChoice", action.getClass());
return action;
}
}
}