diff --git a/lang/src/main/java/edu/kit/iti/formal/psdbg/ShortCommandPrinter.java b/lang/src/main/java/edu/kit/iti/formal/psdbg/ShortCommandPrinter.java index 74acacd1cedc769a299191d978916951e86a7daa..e954a5e209f7b5c095cececa3a9a5119687d09b8 100644 --- a/lang/src/main/java/edu/kit/iti/formal/psdbg/ShortCommandPrinter.java +++ b/lang/src/main/java/edu/kit/iti/formal/psdbg/ShortCommandPrinter.java @@ -16,6 +16,11 @@ public class ShortCommandPrinter extends DefaultASTVisitor { return (Facade.prettyPrint(node)); } + @Override + public String visit(Statements statements) { + return "{ ... " + statements.size() + " ... }"; + } + @Override public String visit(ProofScript proofScript) { return String.format("script %s (%s) {%n", diff --git a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/ASTNode.java b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/ASTNode.java index 0b76960555173efa9f234ca67e2a25e2e488979c..78d41fadcd53186d26ce54124074d8ddba462335 100644 --- a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/ASTNode.java +++ b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/ASTNode.java @@ -129,4 +129,14 @@ public abstract class ASTNode public boolean eq(ASTNode other) { return equals(other); } + + public int getDepth() { + int depth = 0; + ASTNode n = this; + do { + n = n.getParent(); + depth++; + } while (n != null); + return depth; + } } diff --git a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/Interpreter.java b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/Interpreter.java index 1187746eb6c4c09550134ed1222e75c15eed1ffb..550ef57ca83b4ee9cadfdaecc23c876643b88dff 100644 --- a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/Interpreter.java +++ b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/Interpreter.java @@ -531,9 +531,11 @@ public class Interpreter extends DefaultASTVisitor //newErrorState.setErrorState(true); //pushState(newErrorState); } - g.exitScope(); - // System.out.println(stateStack.peek().hashCode()); - exitScope(call); + finally { + g.exitScope(); + // System.out.println(stateStack.peek().hashCode()); + exitScope(call); + } return null; } diff --git a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/Blocker.java b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/Blocker.java index d5380239378d23ff376f47a0a95978c71c582167..1454858523d6aa7c96289b442445e64288b34197 100644 --- a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/Blocker.java +++ b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/Blocker.java @@ -13,6 +13,7 @@ import java.util.HashSet; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Predicate; +import java.util.function.Supplier; public abstract class Blocker { public interface BlockPredicate extends Predicate { @@ -100,6 +101,18 @@ public abstract class Blocker { } } + @RequiredArgsConstructor + public static class SmallerContext implements BlockPredicate { + private final int depth; + + private final Supplier currenDepth; + + @Override + public boolean test(ASTNode astNode) { + return currenDepth.get() <= depth; + } + } + @RequiredArgsConstructor public static class ParentInContext implements BlockPredicate { diff --git a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/StateWrapper.java b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/StateWrapper.java index 41e6d7c9a0c2b8efcd23bede752c74c2f09436b9..4995df0acba897664e973ecc5924d8cd3d1022c8 100644 --- a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/StateWrapper.java +++ b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/StateWrapper.java @@ -1,5 +1,6 @@ package edu.kit.iti.formal.psdbg.interpreter.dbg; +import edu.kit.iti.formal.psdbg.ShortCommandPrinter; import edu.kit.iti.formal.psdbg.interpreter.Interpreter; import edu.kit.iti.formal.psdbg.interpreter.data.State; import edu.kit.iti.formal.psdbg.parser.DefaultASTVisitor; @@ -7,6 +8,7 @@ import edu.kit.iti.formal.psdbg.parser.Visitor; import edu.kit.iti.formal.psdbg.parser.ast.ASTNode; import edu.kit.iti.formal.psdbg.parser.ast.ProofScript; import edu.kit.iti.formal.psdbg.parser.ast.Statement; +import edu.kit.iti.formal.psdbg.parser.ast.Statements; import lombok.Getter; import lombok.Setter; import org.apache.logging.log4j.LogManager; @@ -87,6 +89,11 @@ public class StateWrapper implements InterpreterObserver { lastNode.setStateAfterStmt(getInterpreterStateCopy()); if (node.equals(peekContext())) { popContext(); + } else { + LOGGER.error("Context mismatched, got {}, expected {}", + node.accept(new ShortCommandPrinter()), + peekContext().accept(new ShortCommandPrinter()) + ); } } @@ -105,13 +112,19 @@ public class StateWrapper implements InterpreterObserver { @Override public Void defaultVisit(ASTNode node) { - if (node instanceof Statement) - createNormalNode(node); + LOGGER.error("enter {}", node.accept(new ShortCommandPrinter())); + createNormalNode(node); + return null; + } + + @Override + public Void visit(Statements statements) { return null; } @Override public Void visit(ProofScript proofScript) { + LOGGER.error("enter {}", proofScript.accept(new ShortCommandPrinter())); if (root) { createRoot(proofScript); root = false; @@ -125,9 +138,15 @@ public class StateWrapper implements InterpreterObserver { private class ExitListener extends DefaultASTVisitor { @Override public Void defaultVisit(ASTNode node) { - if (node instanceof Statement) - completeLastNode(node); + LOGGER.error("exit {}", node.accept(new ShortCommandPrinter())); + completeLastNode(node); return null; } + + @Override + public Void visit(Statements statements) { + return null; + } + } } diff --git a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/StepOverCommand.java b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/StepOverCommand.java index 437e6c00bf6e05f93288b745abe9995d0ccc2143..10adba5b3c2f7f664a77b8fcbcb89c7631065d62 100644 --- a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/StepOverCommand.java +++ b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/StepOverCommand.java @@ -1,9 +1,9 @@ package edu.kit.iti.formal.psdbg.interpreter.dbg; import edu.kit.iti.formal.psdbg.parser.ast.ASTNode; -import edu.kit.iti.formal.psdbg.parser.ast.ProofScript; import java.util.Arrays; +import java.util.function.Supplier; public class StepOverCommand extends DebuggerCommand { @Override @@ -19,12 +19,15 @@ public class StepOverCommand extends DebuggerCommand { ASTNode[] ctx = statePointer.getContext(); //statePointer stands on the main script, we add the script itself to the context if (statePointer.getContext().length == 0) { - ctx = Arrays.copyOf(ctx, ctx.length+1); + ctx = Arrays.copyOf(ctx, ctx.length + 1); ctx[ctx.length - 1] = statePointer.getStatement(); } + Supplier currenDepth = () -> dbg.getStatePointer().getContext().length; - Blocker.BlockPredicate predicate = new Blocker.ParentInContext(ctx); + //Blocker.BlockPredicate predicate = new Blocker.ParentInContext(ctx); + Blocker.SmallerContext predicate = new Blocker.SmallerContext( + currenDepth.get(), currenDepth); dbg.releaseUntil(predicate); } else { diff --git a/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controls/ScriptController.java b/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controls/ScriptController.java index 0f8be880a7b90ac610c3cfbc8dfdf5a71f23343b..44a172738134003711d747875afa2b00c7212ded 100644 --- a/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controls/ScriptController.java +++ b/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controls/ScriptController.java @@ -15,8 +15,6 @@ import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableMap; -import javafx.geometry.Point2D; -import javafx.scene.Cursor; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CharStreams; import org.apache.commons.io.FileUtils; @@ -81,8 +79,11 @@ public class ScriptController { } private ScriptArea findEditor(ASTNode node) { - File f = new File(node.getOrigin()); - return findEditor(f); + if (node.getOrigin() != null) { + File f = new File(node.getOrigin()); + return findEditor(f); + } + return null; } /** @@ -297,16 +298,19 @@ public class ScriptController { logger.debug("Region for highlighting: {}", r); ScriptArea area = findEditor(node); - double scrollY = area.getEstimatedScrollY(); - area.getMarkedRegions().add(r); + if (area != null) { + area.getMarkedRegions().add(r); - getDockNode(area).focus(); - area.requestFocus(); - //area.scrollBy(new Point2D(0, scrollY)); - area.selectRange(0, r.start, 0, r.stop); + getDockNode(area).focus(); + area.requestFocus(); + //area.scrollBy(new Point2D(0, scrollY)); + area.selectRange(0, r.start, 0, r.stop); - lastScriptArea = area; - lastRegion = r; + lastScriptArea = area; + lastRegion = r; + } else { + logger.error("Could not find editor for: " + node.getOrigin()); + } } public void remove() {