From 0bb6b3bcb25d8fcded0177bdc7cce7adf5bdad45 Mon Sep 17 00:00:00 2001 From: Shugang Kang Date: Tue, 10 Oct 2017 21:46:42 -0400 Subject: [PATCH 1/3] fix issue 14 --- lib/python-debugger-view.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/python-debugger-view.coffee b/lib/python-debugger-view.coffee index 81f8fde..1e39b37 100644 --- a/lib/python-debugger-view.coffee +++ b/lib/python-debugger-view.coffee @@ -72,6 +72,7 @@ class PythonDebuggerView extends View @stopApp() if @backendDebugger @debuggedFileArgs = @getInputArguments() console.log @debuggedFileArgs + @debuggedFileName = @getCurrentFilePath() if @pathsNotSet() @askForPaths() return From ce658326eccec51d2b1e34e6d147f62263239cf5 Mon Sep 17 00:00:00 2001 From: Shugang Kang Date: Tue, 10 Oct 2017 21:53:30 -0400 Subject: [PATCH 2/3] fix a break point toggle issue. --- lib/breakpoint-store.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/breakpoint-store.coffee b/lib/breakpoint-store.coffee index ab3d8b6..54f5d52 100644 --- a/lib/breakpoint-store.coffee +++ b/lib/breakpoint-store.coffee @@ -9,7 +9,7 @@ class BreakpointStore addDecoration = true if breakpointSearched - @breakpoints.splice(breakpointSearched, 1) + @breakpoints.splice(@breakpoints.indexOf(breakpointSearched), 1) addDecoration = false else @breakpoints.push(breakpoint) From 761790f7341969e7b9c0e8843f435c8caf5b1063 Mon Sep 17 00:00:00 2001 From: Shugang Kang Date: Tue, 10 Oct 2017 22:03:40 -0400 Subject: [PATCH 3/3] make some enhancements --- lib/breakpoint-store.coffee | 2 + lib/python-debugger-view.coffee | 94 ++++++++++++++++++++++++++++++--- 2 files changed, 88 insertions(+), 8 deletions(-) diff --git a/lib/breakpoint-store.coffee b/lib/breakpoint-store.coffee index 54f5d52..63b579e 100644 --- a/lib/breakpoint-store.coffee +++ b/lib/breakpoint-store.coffee @@ -21,12 +21,14 @@ class BreakpointStore d = editor.decorateMarker(marker, type: "line-number", class: "line-number-red") d.setProperties(type: "line-number", class: "line-number-red") breakpoint.decoration = d + return "b" else editor = atom.workspace.getActiveTextEditor() ds = editor.getLineNumberDecorations(type: "line-number", class: "line-number-red") for d in ds marker = d.getMarker() marker.destroy() if marker.getBufferRange().start.row == breakpoint.lineNumber-1 + return "cl" containsBreakpoint: (bp) -> for breakpoint in @breakpoints diff --git a/lib/python-debugger-view.coffee b/lib/python-debugger-view.coffee index 1e39b37..f8f7254 100644 --- a/lib/python-debugger-view.coffee +++ b/lib/python-debugger-view.coffee @@ -32,23 +32,67 @@ class PythonDebuggerView extends View @subview "commandEntryView", new TextEditorView mini: true, placeholderText: "> Enter debugger commands here" + @button outlet: "breakpointBtn", click: "toggleBreak", class: "btn", => + @span "break point" + @button class: "btn", => + @span " " @button outlet: "runBtn", click: "runApp", class: "btn", => @span "run" @button outlet: "stopBtn", click: "stopApp", class: "btn", => @span "stop" - @button outlet: "clearBtn", click: "clearOutput", class: "btn", => - @span "clear" + @button class: "btn", => + @span " " @button outlet: "stepOverBtn", click: "stepOverBtnPressed", class: "btn", => @span "next" @button outlet: "stepInBtn", click: "stepInBtnPressed", class: "btn", => @span "step" - @button outlet: "continueBtn", click: "continueBtnPressed", class: "btn", => - @span "continue" + @button outlet: "varBtn", click: "varBtnPressed", class: "btn", => + @span "variables" + @button class: "btn", => + @span " " @button outlet: "returnBtn", click: "returnBtnPressed", class: "btn", => @span "return" + @button outlet: "continueBtn", click: "continueBtnPressed", class: "btn", => + @span "continue" + @button class: "btn", => + @span " " + @button outlet: "upBtn", click: "upBtnPressed", class: "btn", => + @span "up" + @button outlet: "callstackBtn", click: "callstackBtnPressed", class: "btn", => + @span "callstack" + @button outlet: "downBtn", click: "downBtnPressed", class: "btn", => + @span "down" + @button class: "btn", => + @span " " + @button outlet: "clearBtn", click: "clearOutput", class: "btn", => + @span "clear" @div class: "panel-body", outlet: "outputContainer", => @pre class: "command-output", outlet: "output" + toggleBreak: -> + editor = atom.workspace.getActiveTextEditor() + filename = editor.getTitle() + lineNumber = editor.getCursorBufferPosition().row + 1 + breakpoint = new Breakpoint(filename, lineNumber) + cmd = @breakpointStore.toggle(breakpoint) + if @backendDebugger + @backendDebugger.stdin.write(cmd + " " + @getCurrentFilePath() + ":" + lineNumber + "\n") + @output.empty() + for breakpoint in @breakpointStore.breakpoints + @output.append(breakpoint.toCommand() + "\n") + + upBtnPressed: -> + @output.empty() + @backendDebugger?.stdin.write("up\nbt\n") + + callstackBtnPressed: -> + @output.empty() + @backendDebugger?.stdin.write("bt\n") + + downBtnPressed: -> + @output.empty() + @backendDebugger?.stdin.write("down\nbt\n") + stepOverBtnPressed: -> @backendDebugger?.stdin.write("n\n") @@ -78,12 +122,39 @@ class PythonDebuggerView extends View return @runBackendDebugger() + varBtnPressed: -> + @output.empty() + + @backendDebugger?.stdin.write("for (__k, __v) in [(__k, __v) for __k, __v in globals().items() if not __k.startswith('__')]: print __k, '=', __v\n") + @backendDebugger?.stdin.write("print '-------------'\n") + @backendDebugger?.stdin.write("for (__k, __v) in [(__k, __v) for __k, __v in locals().items() if __k != 'self' and not __k.startswith('__')]: print __k, '=', __v\n") + @backendDebugger?.stdin.write("for (__k, __v) in [(__k, __v) for __k, __v in (self.__dict__ if 'self' in locals().keys() else {}).items()]: print 'self.{0}'.format(__k), '=', __v\n") + + + # Extract the file name and line number output by the debugger. processDebuggerOutput: (data) -> data_str = data.toString().trim() lineNumber = null fileName = null - + call_stack_str = "Call stack: \n" + + m = /[^-]> (.*[.]py)[(]([0-9]*)[)].*/.exec(data_str) + if m + [fileName, lineNumber] = [m[1], m[2]] + ` + re = /[\n](>*)[ \t]*(.*[.]py)[(]([0-9]*)[)]([^\n]*)[\n]([^\n]*)/gi; + while ((match = re.exec(data_str))) + { + if (match[1].includes('>')) + call_stack_str += '--> '; + else + call_stack_str += ' '; + call_stack_str += match[5].replace("->", "") + " in " + match[4] + " @ " + match [2] + ": " + match[3] + "\n"; + } + ` + data_str = call_stack_str + [data_str, tail] = data_str.split("line:: ") if tail [lineNumber, tail] = tail.split("\n") @@ -98,9 +169,16 @@ class PythonDebuggerView extends View if lineNumber && fileName lineNumber = parseInt(lineNumber) - options = {initialLine: lineNumber-1, initialColumn:0} - atom.workspace.open(fileName, options) if fs.existsSync(fileName) - # TODO: add decoration to current line? + editor = atom.workspace.getActiveTextEditor() + if fileName.toLowerCase() == editor.getPath().toLowerCase() + position = Point(lineNumber-1, 0) + editor.setCursorBufferPosition(position) + editor.unfoldBufferRow(lineNumber) + editor.scrollToBufferPosition(position) + else + options = {initialLine: lineNumber-1, initialColumn:0} + atom.workspace.open(fileName, options) if fs.existsSync(fileName) + # TODO: add decoration to current line? @addOutput(data_str.trim())