From d519993729a5e2cf4213ac6047befac1dad39030 Mon Sep 17 00:00:00 2001 From: Sarah Grebing Date: Fri, 27 Oct 2017 09:03:56 +0200 Subject: [PATCH] Highlighting of next ASTNode, revealed a bug in copy method of ASTNodes --- .../psdbg/parser/ast/AssignmentStatement.java | 1 + .../psdbg/parser/ast/BinaryExpression.java | 1 + .../psdbg/parser/ast/CallStatement.java | 5 +- .../psdbg/parser/ast/CaseStatement.java | 4 +- .../psdbg/parser/ast/CasesStatement.java | 1 + .../formal/psdbg/parser/ast/ClosesCase.java | 4 +- .../parser/ast/DefaultCaseStatement.java | 4 +- .../psdbg/parser/ast/ForeachStatement.java | 4 +- .../psdbg/parser/ast/MatchExpression.java | 1 + .../formal/psdbg/parser/ast/Parameters.java | 1 + .../formal/psdbg/parser/ast/ProofScript.java | 1 + .../psdbg/parser/ast/RepeatStatement.java | 4 +- .../formal/psdbg/parser/ast/Signature.java | 1 + .../psdbg/parser/ast/SimpleCaseStatement.java | 4 +- .../formal/psdbg/parser/ast/Statements.java | 7 +- .../parser/ast/SubstituteExpression.java | 1 + .../psdbg/parser/ast/TheOnlyStatement.java | 4 +- .../iti/formal/psdbg/parser/ast/TryCase.java | 4 +- .../psdbg/parser/ast/UnaryExpression.java | 1 + .../psdbg/interpreter/InterpreterBuilder.java | 2 +- .../interpreter/TryCaseHistoryLogger.java | 4 +- .../formal/psdbg/interpreter/Interpreter.java | 10 +++ .../data/InterpreterExtendedState.java | 2 +- .../psdbg/interpreter/dbg/Debugger.java | 6 +- .../interpreter/graphs/StateGraphWrapper.java | 6 +- .../gui/controller/ProofTreeController.java | 17 +++- .../psdbg/gui/controller/PuppetMaster.java | 4 +- .../gui/controls/ASTNodeHiglightListener.java | 88 +++++++++++++++++++ 28 files changed, 166 insertions(+), 26 deletions(-) create mode 100644 ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controls/ASTNodeHiglightListener.java diff --git a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/AssignmentStatement.java b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/AssignmentStatement.java index 1cfba19e..dcff70f5 100644 --- a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/AssignmentStatement.java +++ b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/AssignmentStatement.java @@ -61,6 +61,7 @@ public class AssignmentStatement s.lhs = lhs.copy(); s.rhs = rhs.copy(); s.type = type; + s.setRuleContext(this.ruleContext); return s; } diff --git a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/BinaryExpression.java b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/BinaryExpression.java index a4ce211f..a5723f7e 100644 --- a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/BinaryExpression.java +++ b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/BinaryExpression.java @@ -58,6 +58,7 @@ public class BinaryExpression extends Expression { @Override public BinaryExpression copy() { BinaryExpression be = new BinaryExpression(left.copy(), operator, right.copy()); + be.setRuleContext(this.ruleContext); return be; } diff --git a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/CallStatement.java b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/CallStatement.java index e36c57b2..4bab1290 100644 --- a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/CallStatement.java +++ b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/CallStatement.java @@ -63,6 +63,9 @@ public class CallStatement extends Statement @Override public Parameters copy() { Parameters p = new Parameters(); forEach((k, v) -> p.put(k.copy(), v.copy())); + p.setRuleContext(this.getRuleContext()); return p; } diff --git a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/ProofScript.java b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/ProofScript.java index 46987b7d..6526c539 100644 --- a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/ProofScript.java +++ b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/ProofScript.java @@ -54,6 +54,7 @@ public class ProofScript extends ASTNode { ps.setName(getName()); ps.setBody(body.copy()); ps.setSignature(signature.copy()); + ps.setRuleContext(this.ruleContext); return ps; } diff --git a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/RepeatStatement.java b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/RepeatStatement.java index f692219f..131a7f68 100644 --- a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/RepeatStatement.java +++ b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/RepeatStatement.java @@ -54,6 +54,8 @@ public class RepeatStatement extends GoalSelector impl @Override public Signature copy() { Signature signature = new Signature(); forEach((k, v) -> signature.put(k.copy(), v)); + signature.setRuleContext(this.ruleContext); return signature; } diff --git a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/SimpleCaseStatement.java b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/SimpleCaseStatement.java index bfcd3bf7..6fcdb0ed 100644 --- a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/SimpleCaseStatement.java +++ b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/SimpleCaseStatement.java @@ -33,7 +33,9 @@ public class SimpleCaseStatement extends CaseStatement { */ @Override public SimpleCaseStatement copy() { - return new SimpleCaseStatement(guard.copy(), body.copy()); + SimpleCaseStatement scs = new SimpleCaseStatement(guard.copy(), body.copy()); + scs.setRuleContext(this.ruleContext); + return scs; } diff --git a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/Statements.java b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/Statements.java index b2be05ea..ebc59db0 100644 --- a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/Statements.java +++ b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/Statements.java @@ -174,7 +174,12 @@ public class Statements extends ASTNode @Override public Statements copy() { Statements s = new Statements(); - forEach(e -> s.add(e.copy())); + forEach(e -> { + Statement ecopy = e.copy(); + ecopy.setRuleContext(e.getRuleContext()); + s.add(ecopy); + }); + s.setRuleContext(this.getRuleContext()); return s; } } diff --git a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/SubstituteExpression.java b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/SubstituteExpression.java index 49ea9fa9..9a7ea5e2 100644 --- a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/SubstituteExpression.java +++ b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/SubstituteExpression.java @@ -39,6 +39,7 @@ public class SubstituteExpression extends Expression(substitution); + se.setRuleContext(this.ruleContext); return se; } diff --git a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/TheOnlyStatement.java b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/TheOnlyStatement.java index 7dbadddc..44eecc3b 100644 --- a/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/TheOnlyStatement.java +++ b/lang/src/main/java/edu/kit/iti/formal/psdbg/parser/ast/TheOnlyStatement.java @@ -54,6 +54,8 @@ public class TheOnlyStatement extends GoalSelector { @Override public UnaryExpression copy() { UnaryExpression u = new UnaryExpression(operator, expression.copy()); + u.setRuleContext(this.getRuleContext()); return u; } diff --git a/rt-key/src/main/java/edu/kit/iti/formal/psdbg/interpreter/InterpreterBuilder.java b/rt-key/src/main/java/edu/kit/iti/formal/psdbg/interpreter/InterpreterBuilder.java index 04ef8af0..2eec8761 100644 --- a/rt-key/src/main/java/edu/kit/iti/formal/psdbg/interpreter/InterpreterBuilder.java +++ b/rt-key/src/main/java/edu/kit/iti/formal/psdbg/interpreter/InterpreterBuilder.java @@ -117,7 +117,7 @@ public class InterpreterBuilder { } public InterpreterBuilder onEntry(Visitor v) { - interpreter.getEntryListeners().add(v); + interpreter.getEntryListeners().add(0, v); return this; } diff --git a/rt-key/src/main/java/edu/kit/iti/formal/psdbg/interpreter/TryCaseHistoryLogger.java b/rt-key/src/main/java/edu/kit/iti/formal/psdbg/interpreter/TryCaseHistoryLogger.java index 04f98007..f551a584 100644 --- a/rt-key/src/main/java/edu/kit/iti/formal/psdbg/interpreter/TryCaseHistoryLogger.java +++ b/rt-key/src/main/java/edu/kit/iti/formal/psdbg/interpreter/TryCaseHistoryLogger.java @@ -46,8 +46,8 @@ public class TryCaseHistoryLogger extends HistoryListener { public void install(Interpreter interpreter) { if (currentInterpreter != null) deinstall(interpreter); - interpreter.getEntryListeners().add(entryListener); - interpreter.getExitListeners().add(exitListener); + interpreter.getEntryListeners().add(0, entryListener); + interpreter.getExitListeners().add(0, exitListener); this.currentInterpreter = interpreter; } 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 fcbbb13a..eeb0e40d 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 @@ -37,6 +37,8 @@ public class Interpreter extends DefaultASTVisitor //We now need thet stack of listeners to handle try statements scuh that listnersa re only informed if a try was sucessfull private Stack> entryListenerStack = new Stack<>(); private Stack> exitListenerStack = new Stack<>(); + //there is at most one special listener that is allowed to block and that is invoked last when informing all listeners + private Visitor blockingEntryListener = new DefaultASTVisitor(); //@Getter //private List entryListeners = new ArrayList<>(), @@ -71,6 +73,14 @@ public class Interpreter extends DefaultASTVisitor return entryListenerStack.peek(); } + public void addBlockingEntryListener(Visitor v) { + blockingEntryListener = v; + } + + public void removeBlockingEntryListener() { + blockingEntryListener = new DefaultASTVisitor(); + } + /** * starting point is a statement list */ diff --git a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/data/InterpreterExtendedState.java b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/data/InterpreterExtendedState.java index 4a3f7a02..e6174073 100644 --- a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/data/InterpreterExtendedState.java +++ b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/data/InterpreterExtendedState.java @@ -60,7 +60,7 @@ public class InterpreterExtendedState { } else { ext.predecessor = null; } - ext.setStmt(stmt.copy()); + ext.setStmt(stmt); if (stateAfterStmt != null) { ext.setStateAfterStmt(this.stateAfterStmt.copy()); } else { diff --git a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/Debugger.java b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/Debugger.java index 15d65ed2..26fc0ed7 100644 --- a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/Debugger.java +++ b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/dbg/Debugger.java @@ -4,7 +4,6 @@ import edu.kit.iti.formal.psdbg.interpreter.HistoryListener; import edu.kit.iti.formal.psdbg.interpreter.Interpreter; import edu.kit.iti.formal.psdbg.interpreter.data.GoalNode; import edu.kit.iti.formal.psdbg.interpreter.data.State; -import edu.kit.iti.formal.psdbg.parser.data.Value; import edu.kit.iti.formal.psdbg.interpreter.data.VariableAssignment; import edu.kit.iti.formal.psdbg.interpreter.funchdl.BuiltinCommands; import edu.kit.iti.formal.psdbg.interpreter.funchdl.CommandHandler; @@ -13,6 +12,8 @@ import edu.kit.iti.formal.psdbg.parser.DefaultASTVisitor; import edu.kit.iti.formal.psdbg.parser.Facade; import edu.kit.iti.formal.psdbg.parser.ScriptLanguageParser; import edu.kit.iti.formal.psdbg.parser.TransformAst; +import edu.kit.iti.formal.psdbg.parser.ast.*; +import edu.kit.iti.formal.psdbg.parser.data.Value; import org.antlr.v4.runtime.CharStreams; import java.io.BufferedReader; @@ -22,7 +23,6 @@ import java.io.InputStreamReader; import java.math.BigInteger; import java.util.List; import java.util.function.BiConsumer; -import edu.kit.iti.formal.psdbg.parser.ast.*; /** * @author Alexander Weigl * @version 1 (21.05.2017) @@ -44,8 +44,8 @@ public class Debugger { history = new HistoryListener(interpreter); scripts = Facade.getAST(new File(file)); interpreter.getEntryListeners().add(history); - interpreter.getEntryListeners().add(blocker); interpreter.getEntryListeners().add(new CommandLogger()); + interpreter.getEntryListeners().add(blocker); registerDebuggerFunction("step", this::step); registerDebuggerFunction("b", this::setBreakpoint); diff --git a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/graphs/StateGraphWrapper.java b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/graphs/StateGraphWrapper.java index 2fcbb16f..ca15d926 100644 --- a/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/graphs/StateGraphWrapper.java +++ b/rt/src/main/java/edu/kit/iti/formal/psdbg/interpreter/graphs/StateGraphWrapper.java @@ -276,8 +276,6 @@ public class StateGraphWrapper { } private void fireNodeAdded(NodeAddedEvent nodeAddedEvent) { - //counter++; - //System.out.println("XXXXXXXXXX counter = " + counter); changeListeners.forEach(list -> Platform.runLater(() -> { list.graphChanged(nodeAddedEvent); //TODO @@ -287,8 +285,8 @@ public class StateGraphWrapper { public void install(Interpreter interpreter) { if (currentInterpreter != null) deinstall(interpreter); - interpreter.getEntryListeners().add(entryListener); - interpreter.getExitListeners().add(exitListener); + interpreter.getEntryListeners().add(0, entryListener); + interpreter.getExitListeners().add(0, exitListener); currentInterpreter = interpreter; } diff --git a/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controller/ProofTreeController.java b/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controller/ProofTreeController.java index 9e3c2b05..183b4541 100644 --- a/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controller/ProofTreeController.java +++ b/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controller/ProofTreeController.java @@ -3,6 +3,7 @@ package edu.kit.iti.formal.psdbg.gui.controller; import com.google.common.eventbus.Subscribe; import com.google.common.graph.MutableValueGraph; import edu.kit.iti.formal.psdbg.InterpretingService; +import edu.kit.iti.formal.psdbg.gui.controls.ASTNodeHiglightListener; import edu.kit.iti.formal.psdbg.gui.controls.DebuggerStatusBar; import edu.kit.iti.formal.psdbg.gui.controls.Utils; import edu.kit.iti.formal.psdbg.gui.model.Breakpoint; @@ -195,7 +196,7 @@ public class ProofTreeController { LOGGER.info("Setting new State " + state.toString()); //Statepointer null wenn anfangszustand? if (statePointer != null && state != null) { - setCurrentHighlightNode(statePointer.getScriptstmt()); + //setCurrentHighlightNode(statePointer.getScriptstmt()); //get all goals that are open Object[] arr = state.getGoals().stream().filter(keyDataGoalNode -> !keyDataGoalNode.isClosed()).toArray(); //if there is no selected goal node we might have reached @@ -253,7 +254,7 @@ public class ProofTreeController { //if nextnode is null ask interpreter to execute next statement and compute next state if (nextNode != null) { - setCurrentHighlightNode(nextNode.getScriptstmt()); + //setCurrentHighlightNode(nextNode.getScriptstmt()); } if (nextNode != null && nextNode.getExtendedState().getStateAfterStmt() != null) { @@ -330,7 +331,7 @@ public class ProofTreeController { statusBar.setText("Starting to interpret script " + mainScript.getName()); statusBar.indicateProgress(); - setCurrentHighlightNode(mainScript.get()); + //setCurrentHighlightNode(mainScript.get()); //build CFG buildControlFlowGraph(mainScript.get()); @@ -341,6 +342,16 @@ public class ProofTreeController { this.stateGraphWrapper.install(currentInterpreter); this.stateGraphWrapper.addChangeListener(graphChangedListener); + ASTNodeHiglightListener astNodeHiglightListener = new ASTNodeHiglightListener(currentInterpreter); + astNodeHiglightListener.install(currentInterpreter); + astNodeHiglightListener.currentHighlightNodeProperty().addListener((observable, oldValue, newValue) -> { + if (newValue != null) { + ASTNode astNode = (ASTNode) newValue; + setCurrentHighlightNode(astNode); + //this.setCurrentHighlightNode(); + } + }); + statusBar.publishMessage("Stategraph was set up"); statusBar.stopProgress(); diff --git a/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controller/PuppetMaster.java b/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controller/PuppetMaster.java index 1e625afd..b45b39d7 100644 --- a/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controller/PuppetMaster.java +++ b/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controller/PuppetMaster.java @@ -83,12 +83,12 @@ public class PuppetMaster { } public Void checkForHalt(ASTNode node) { - System.out.println("node = [" + node + "]"); + //("PuppetMaster CheckForHalt node = [" + node + "]"); //<0 run if (stepUntilBlock.get() > 0) stepUntilBlock.decrementAndGet(); - System.out.println("Blocker: " + stepUntilBlock.get()); + if (stepUntilBlock.get() == 0) { //publishState(); block(); diff --git a/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controls/ASTNodeHiglightListener.java b/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controls/ASTNodeHiglightListener.java new file mode 100644 index 00000000..e368c67a --- /dev/null +++ b/ui/src/main/java/edu/kit/iti/formal/psdbg/gui/controls/ASTNodeHiglightListener.java @@ -0,0 +1,88 @@ +package edu.kit.iti.formal.psdbg.gui.controls; + +import edu.kit.iti.formal.psdbg.interpreter.Interpreter; +import edu.kit.iti.formal.psdbg.parser.DefaultASTVisitor; +import edu.kit.iti.formal.psdbg.parser.ast.ASTNode; +import edu.kit.iti.formal.psdbg.parser.ast.CallStatement; +import edu.kit.iti.formal.psdbg.parser.ast.ProofScript; +import edu.kit.iti.formal.psdbg.parser.ast.Statements; +import javafx.application.Platform; +import javafx.beans.property.SimpleObjectProperty; + +/** + * Sets a property that can be used to highlight ASTNodes in the SScriptArea according to current interpreterstate + * Contains a listener that listens on entry of an ASTNode + * + * @param + */ +public class ASTNodeHiglightListener { + + private SimpleObjectProperty currentHighlightNode = new SimpleObjectProperty<>(); + private Interpreter currentInterpreter; + private HighlightEntryListener list = new HighlightEntryListener(); + private ASTNode lastHighlightedNode; + + public ASTNodeHiglightListener(Interpreter inter) { + + } + + public ASTNode getCurrentHighlightNode() { + return currentHighlightNode.get(); + } + + public void setCurrentHighlightNode(ASTNode currentHighlightNode) { + this.currentHighlightNode.set(currentHighlightNode); + } + + public SimpleObjectProperty currentHighlightNodeProperty() { + return currentHighlightNode; + } + + public void install(Interpreter interpreter) { + if (currentInterpreter != null) deinstall(interpreter); + int i = interpreter.getEntryListeners().size(); + interpreter.getEntryListeners().add(0, list); + // interpreter.getExitListeners().add(0, exitListener); + currentInterpreter = interpreter; + } + + private void deinstall(Interpreter interpreter) { + if (interpreter != null) { + interpreter.getEntryListeners().remove(list); + // interpreter.getExitListeners().remove(exitListener); + } + } + + public class HighlightEntryListener extends DefaultASTVisitor { + + @Override + public Void visit(ProofScript proofScript) { + return defaultVisit(proofScript); + } + + @Override + public Void visit(CallStatement proofScript) { + return defaultVisit(proofScript); + } + + @Override + public Void visit(Statements statements) { + return null; + } + + @Override + public Void defaultVisit(ASTNode node) { + if (node != null) { + lastHighlightedNode = node; + System.out.println("nodeInHighlighter = " + node); + System.out.println("lastHighlightedNode = " + lastHighlightedNode); + + Platform.runLater(() -> { + currentHighlightNode.setValue(lastHighlightedNode); + + }); + } + return null; + } + } +} -- GitLab