package org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.repl.debug; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.URISyntaxException; import org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.Frame; import org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.RVMCore; import org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.Thrown; import org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.ideservices.IDEServices; import org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.observers.IFrameObserver; import org.rascalmpl.library.util.PathConfig; import jline.Terminal; public class DebugREPLFrameObserver implements IFrameObserver { private final PathConfig pcfg; private final InputStream stdin; private final OutputStream stdout; private final File historyFile; private final Terminal terminal; private final BreakPointManager breakPointManager; private RVMCore rvm; public DebugREPLFrameObserver(PathConfig pcfg, InputStream stdin, OutputStream stdout, boolean prettyPrompt, boolean allowColors, File file, Terminal terminal, IDEServices ideServices) throws IOException{ this.pcfg = pcfg; this.stdin = stdin; this.stdout = stdout; this.historyFile = file; this.terminal = terminal; this.breakPointManager = new BreakPointManager(pcfg, new PrintWriter(stdout), ideServices); } void reset(){ if(breakPointManager != null){ breakPointManager.reset(); } } public BreakPointManager getBreakPointManager(){ return breakPointManager; } public DebugREPLFrameObserver getObserverWhenActiveBreakpoints(){ breakPointManager.reset(); //return this; return breakPointManager.hasEnabledBreakPoints() ? this : null; } @Override public void setRVM(RVMCore rvm){ this.rvm = rvm; } @Override public RVMCore getRVM(){ return rvm; } @Override public boolean observe(Frame frame) { try { if(breakPointManager.matchOnObserve(frame)){ new DebugREPL(pcfg, rvm, frame, breakPointManager, stdin, stdout, true, true, historyFile, terminal).run(); } } catch (IOException | URISyntaxException e) { e.printStackTrace(); } return breakPointManager.shouldContinue(); } @Override public boolean enter(Frame frame) { try { if(breakPointManager.matchOnEnter(frame)){ new DebugREPL(pcfg, rvm, frame, breakPointManager, stdin, stdout, true, true, historyFile, terminal).run(); } } catch (IOException | URISyntaxException e) { e.printStackTrace(); } return breakPointManager.shouldContinue(); } @Override public boolean leave(Frame frame, Object rval) { try { if(breakPointManager.matchOnLeave(frame, rval)){ new DebugREPL(pcfg, rvm, frame, breakPointManager, stdin, stdout, true, true, historyFile, terminal).run(); } } catch (IOException | URISyntaxException e) { e.printStackTrace(); } return breakPointManager.shouldContinue(); } @Override public boolean exception(Frame frame, Thrown thrown){ try { if(breakPointManager.matchOnException(frame, thrown)){ new DebugREPL(pcfg, rvm, frame, breakPointManager, stdin, stdout, true, true, historyFile, terminal).run(); } } catch (IOException | URISyntaxException e) { e.printStackTrace(); } return breakPointManager.shouldContinue(); } }