Loading EDG/src/main/java/edg/constraint/AsteriskConstraint.java +19 −3 Original line number Diff line number Diff line Loading @@ -30,7 +30,11 @@ public class AsteriskConstraint extends EdgeConstraint protected List<Constraints> resolve(Phase phase, EDG edg, Edge edge, Constraints constraints, int productionDepth) { if (phase.isInstanceof(Phase.Slicing)) return super.wrap(constraints); super.check(phase, Phase.SummaryGeneration); return super.wrap(super.push(phase, constraints)); } protected List<Constraints> resolve(Phase phase, EDG edg, Edge edge, Constraints constraints, AccessConstraint topConstraint, int productionDepth) { Loading Loading @@ -75,7 +79,8 @@ public class AsteriskConstraint extends EdgeConstraint { super.check(phase, Phase.SummaryGeneration); if (existsPreviousAsteriskConstraint(constraints)) // If the constraint prior to a grammar constraint is an asterisk constraint and we traverse another Asterisk if (isPreviousConstraintAsteriskConstraint(constraints)) return super.wrap(this.popToAsteriskConstraint(constraints)); return super.wrap(super.push(phase, constraints)); Loading Loading @@ -109,7 +114,7 @@ public class AsteriskConstraint extends EdgeConstraint private boolean existsPreviousAsteriskConstraint(Constraints constraints){ boolean previousAsterisk = false; for(Constraint c : constraints.getEdgeConstraints()) { for(Constraint c : constraints.getEdgeConstraints()) { // Traverse from bottom to top of the stack if (c instanceof AsteriskConstraint) previousAsterisk = true; if (previousAsterisk && c instanceof GrammarConstraint) Loading @@ -118,6 +123,17 @@ public class AsteriskConstraint extends EdgeConstraint return previousAsterisk; } private boolean isPreviousConstraintAsteriskConstraint(Constraints constraints){ Constraints constraintsClone = (Constraints) constraints.clone(); constraintsClone.popEdgeConstraint(); if (constraintsClone.isEdgeConstraintsEmpty()) return false; Constraint c = constraintsClone.popEdgeConstraint(); return c instanceof AsteriskConstraint; } private Constraints popToAsteriskConstraint(Constraints constraints){ Constraint topConstraint = constraints.getEdgeConstraints().peek(); while(!(topConstraint instanceof AsteriskConstraint)){ Loading e-Knife/src/main/java/eknife/erlang/ControlFlowGenerator.java +4 −1 Original line number Diff line number Diff line Loading @@ -213,12 +213,15 @@ public class ControlFlowGenerator extends VoidVisitor<Void> implements Generator guardHangingStack.peek().clear(); graph.getChild(n, Node.Type.Selectable).accept(this, arg); graph.getChild(n, Node.Type.Guard).accept(this, arg); if (!absorbentPattern || !absorbentCondition) guardHangingStack.peek().addAll(Set.copyOf(hangingNodes)); // SAVE THE ABSORBENT CASE STATE AND RESTORE IT AFTER BODY boolean prevAbsorbentPattern = absorbentPattern; boolean prevAbsorbentCondition = absorbentCondition; graph.getChild(n, Node.Type.Body).accept(this, arg); absorbentCondition = prevAbsorbentCondition; absorbentPattern = prevAbsorbentPattern; stopCaseCFG = absorbentPattern && absorbentCondition; Loading Loading
EDG/src/main/java/edg/constraint/AsteriskConstraint.java +19 −3 Original line number Diff line number Diff line Loading @@ -30,7 +30,11 @@ public class AsteriskConstraint extends EdgeConstraint protected List<Constraints> resolve(Phase phase, EDG edg, Edge edge, Constraints constraints, int productionDepth) { if (phase.isInstanceof(Phase.Slicing)) return super.wrap(constraints); super.check(phase, Phase.SummaryGeneration); return super.wrap(super.push(phase, constraints)); } protected List<Constraints> resolve(Phase phase, EDG edg, Edge edge, Constraints constraints, AccessConstraint topConstraint, int productionDepth) { Loading Loading @@ -75,7 +79,8 @@ public class AsteriskConstraint extends EdgeConstraint { super.check(phase, Phase.SummaryGeneration); if (existsPreviousAsteriskConstraint(constraints)) // If the constraint prior to a grammar constraint is an asterisk constraint and we traverse another Asterisk if (isPreviousConstraintAsteriskConstraint(constraints)) return super.wrap(this.popToAsteriskConstraint(constraints)); return super.wrap(super.push(phase, constraints)); Loading Loading @@ -109,7 +114,7 @@ public class AsteriskConstraint extends EdgeConstraint private boolean existsPreviousAsteriskConstraint(Constraints constraints){ boolean previousAsterisk = false; for(Constraint c : constraints.getEdgeConstraints()) { for(Constraint c : constraints.getEdgeConstraints()) { // Traverse from bottom to top of the stack if (c instanceof AsteriskConstraint) previousAsterisk = true; if (previousAsterisk && c instanceof GrammarConstraint) Loading @@ -118,6 +123,17 @@ public class AsteriskConstraint extends EdgeConstraint return previousAsterisk; } private boolean isPreviousConstraintAsteriskConstraint(Constraints constraints){ Constraints constraintsClone = (Constraints) constraints.clone(); constraintsClone.popEdgeConstraint(); if (constraintsClone.isEdgeConstraintsEmpty()) return false; Constraint c = constraintsClone.popEdgeConstraint(); return c instanceof AsteriskConstraint; } private Constraints popToAsteriskConstraint(Constraints constraints){ Constraint topConstraint = constraints.getEdgeConstraints().peek(); while(!(topConstraint instanceof AsteriskConstraint)){ Loading
e-Knife/src/main/java/eknife/erlang/ControlFlowGenerator.java +4 −1 Original line number Diff line number Diff line Loading @@ -213,12 +213,15 @@ public class ControlFlowGenerator extends VoidVisitor<Void> implements Generator guardHangingStack.peek().clear(); graph.getChild(n, Node.Type.Selectable).accept(this, arg); graph.getChild(n, Node.Type.Guard).accept(this, arg); if (!absorbentPattern || !absorbentCondition) guardHangingStack.peek().addAll(Set.copyOf(hangingNodes)); // SAVE THE ABSORBENT CASE STATE AND RESTORE IT AFTER BODY boolean prevAbsorbentPattern = absorbentPattern; boolean prevAbsorbentCondition = absorbentCondition; graph.getChild(n, Node.Type.Body).accept(this, arg); absorbentCondition = prevAbsorbentCondition; absorbentPattern = prevAbsorbentPattern; stopCaseCFG = absorbentPattern && absorbentCondition; Loading