package ru.csu.stan.java.cfg.automaton; import ru.csu.stan.java.cfg.automaton.base.ContextBase; import ru.csu.stan.java.cfg.automaton.base.ControlFlowForkContextBase; import ru.csu.stan.java.cfg.automaton.base.FlowCursor; import ru.csu.stan.java.cfg.jaxb.If; import ru.csu.stan.java.cfg.jaxb.Method; import ru.csu.stan.java.cfg.jaxb.Project; import ru.csu.stan.java.classgen.automaton.IContext; import ru.csu.stan.java.classgen.handlers.NodeAttributes; import ru.csu.stan.java.classgen.util.CompilationUnit; /** * * @author mz * */ class IfContext extends ControlFlowForkContextBase<If>{ private FlowCursor thenCursor; private FlowCursor elseCursor; IfContext(ContextBase previousState, FlowCursor cursor, CompilationUnit compilationUnit, Method method){ super(previousState, cursor, compilationUnit, method); } @Override public IContext<Project> getNextState(IContext<Project> context, String eventName) { if ("then_part".equals(eventName)){ thenCursor = new FlowCursor(); return createStandardControlFlowContext(thenCursor); } if ("else_part".equals(eventName)){ elseCursor = getCursor().clone(); elseCursor.addParentId(getFlowForkBlock().getId().intValue()); if (thenCursor != null) elseCursor.setCurrentId(thenCursor.getCurrentId()); return new ControlFlowContext(this, getMethod(), elseCursor, getCompilationUnit()); } return this; } @Override public void processTag(String name, NodeAttributes attrs) { super.processTag(name, attrs); if ("condition".equals(name)){ if (getFlowForkBlock() != null) getFlowForkBlock().setTest("condition"); } } @Override public void finish(String eventName){ if (isEventFitToContext(eventName)){ addCursorDataToCurrent(thenCursor); if (elseCursor != null) addCursorDataToCurrent(elseCursor); else getCursor().addParentId(getFlowForkBlock().getId().intValue()); } } @Override protected If createFlowForkBlock() { return getObjectFactory().createIf(); } @Override protected String[] getTagNames() { return new String[] {"if"}; } }