package _VisualDVM.ProjectData.SapforData.Loops; import Common.Utils.Index; import Common.Visual.Fonts.VisualiserFonts; import _VisualDVM.ProjectData.Files.DBProjectFile; import _VisualDVM.ProjectData.Messages.Message; import _VisualDVM.ProjectData.SapforData.FileObjectWithMessages; import _VisualDVM.ProjectData.SapforData.Functions.FuncCall; import com.google.gson.annotations.Expose; import java.util.List; import java.util.Vector; public class Loop extends FileObjectWithMessages { @Expose private final int lineNumAfterLoop; @Expose private final int perfectLoop; @Expose private final boolean hasOutGoto; @Expose private final boolean hasPrints; @Expose private final boolean hasNonRectIters; // @Expose private final int childCount; @Expose public LoopState loopState; //--- @Expose public List func_calls = new Vector<>(); @Expose public List non_rect_iters = new Vector<>(); @Expose public List e_gotos = new Vector<>(); @Expose public List i_gotos = new Vector<>(); @Expose public List ios = new Vector<>(); @Expose public List stops = new Vector<>(); @Expose public List loops = new Vector<>(); //-- public List getChildren(){ List children = new Vector<>(); children.addAll(func_calls); children.addAll(non_rect_iters); children.addAll(e_gotos); children.addAll(i_gotos); children.addAll(ios); children.addAll(stops); children.addAll(loops); return children; } public Loop(String[] packedLoopInfo, Index idx, DBProjectFile father_in) { file = father_in.name; int calls = Integer.parseInt(packedLoopInfo[idx.Inc()]);//+ for (int k = 0; k < calls; ++k) { String c_name = packedLoopInfo[idx.Inc()]; int c_line = Integer.parseInt(packedLoopInfo[idx.Inc()]); func_calls.add(new FuncCall(father_in, c_name, c_line)); } line = Integer.parseInt(packedLoopInfo[idx.Inc()]); lineNumAfterLoop = Integer.parseInt(packedLoopInfo[idx.Inc()]); perfectLoop = Integer.parseInt(packedLoopInfo[idx.Inc()]); hasOutGoto = (Integer.parseInt(packedLoopInfo[idx.Inc()]) == 1); hasPrints = (Integer.parseInt(packedLoopInfo[idx.Inc()]) == 1); childCount = Integer.parseInt(packedLoopInfo[idx.Inc()]); int state = Integer.parseInt(packedLoopInfo[idx.Inc()]); switch (state) { case 1: loopState = LoopState.GoodLoop; break; case 2: loopState = LoopState.BadLoop; break; default: loopState = LoopState.Loop; break; } hasNonRectIters = (Integer.parseInt(packedLoopInfo[idx.Inc()]) == 1); //+ if (hasNonRectIters) non_rect_iters.add(new NonRectIter(father_in, line)); ////------------------------------------------------------------------------------- // число внешних переходов int e_gotos_size = Integer.parseInt(packedLoopInfo[idx.Inc()]); //+ for (int k = 0; k < e_gotos_size; ++k) { int c_line = Integer.parseInt(packedLoopInfo[idx.Inc()]); e_gotos.add(new EGoto(father_in, c_line)); } //число внутренних переходов int i_gotos_size = Integer.parseInt(packedLoopInfo[idx.Inc()]); //+ for (int k = 0; k < i_gotos_size; ++k) { int c_line = Integer.parseInt(packedLoopInfo[idx.Inc()]); i_gotos.add(new IGoto(father_in, c_line)); } //число операторов печати int IOs_size = Integer.parseInt(packedLoopInfo[idx.Inc()]); //+ for (int k = 0; k < IOs_size; ++k) { int c_line = Integer.parseInt(packedLoopInfo[idx.Inc()]); ios.add(new IO(father_in, c_line)); } //число операторов останова (STOPб PAUSE) int stops_size = Integer.parseInt(packedLoopInfo[idx.Inc()]); //++ for (int k = 0; k < stops_size; ++k) { int c_line = Integer.parseInt(packedLoopInfo[idx.Inc()]); stops.add(new Stop(father_in, c_line)); } //-------------------------------------------------------------------------------- for (int i = 0; i < childCount; ++i) { Loop nextChild = new Loop(packedLoopInfo, idx, father_in); loops.add(nextChild); } father_in.AllLoops.put(line, this); //нельзя использовать конструктор с параметрами из за особеностей распаковки. CheckMessagesPresence(); } @Override public String TypeKey() { return loopState.toString(); } @Override public String Description() { return "цикл"; } @Override public boolean HasMessage(Message message) { return (message.line >= line) && (message.line < lineNumAfterLoop); } @Override public String toString() { return super.toString() + ((perfectLoop > 1) ? (" тесная вложенность " + perfectLoop) : ""); } @Override public VisualiserFonts getFont() { return loopState.getFont(); } }