diff --git a/adapter/debugAdapter.js b/adapter/debugAdapter.js index 0fa5854..ce10d63 100644 --- a/adapter/debugAdapter.js +++ b/adapter/debugAdapter.js @@ -13,6 +13,8 @@ class MyLuaDebugSession extends LoggingDebugSession { constructor() { super("myLuaDebug.txt"); + console.log("ADAPTER INICIADO"); + this._stackFrames = []; this.setDebuggerLinesStartAt1(true); this.setDebuggerColumnsStartAt1(true); } @@ -27,6 +29,10 @@ class MyLuaDebugSession extends LoggingDebugSession { this.sendResponse(response); } + pendingStackTrace(frames) { + this._stackFrames = frames; + } + handleLine(line) { if (line.startsWith("@@DEBUG@@")) { const json = JSON.parse(line.substring(9)); @@ -47,6 +53,11 @@ class MyLuaDebugSession extends LoggingDebugSession { return; } + if (json.type === "stackTrace") { + this.pendingStackTrace(json.payload.frames); + return; + } + return; } @@ -88,6 +99,28 @@ class MyLuaDebugSession extends LoggingDebugSession { this.sendResponse(response); } + sendDebugCommand(obj) { + if (!this.process || !this.process.stdin) return; + console.log("ENVIANDO CMD:", obj); + const msg = "@@DEBUGCMD@@" + JSON.stringify(obj) + "\n"; + this.process.stdin.write(msg); + } + + nextRequest(response, args) { + this.sendDebugCommand({ cmd: "stepOver" }); + this.sendResponse(response); + } + + stepInRequest(response, args) { + this.sendDebugCommand({ cmd: "stepInto" }); + this.sendResponse(response); + } + + stepOutRequest(response, args) { + this.sendDebugCommand({ cmd: "stepOut" }); + this.sendResponse(response); + } + setBreakPointsRequest(response, args) { const path = args.source.path; // archivo donde se han puesto breakpoints const clientBreakpoints = args.breakpoints || []; @@ -108,9 +141,10 @@ class MyLuaDebugSession extends LoggingDebugSession { lines: lines }; - this.process.stdin.write( - "@@DEBUGCMD@@" + JSON.stringify(msg) + "\n" - ); + this.sendDebugCommand(msg); + //this.process.stdin.write( + // "@@DEBUGCMD@@" + JSON.stringify(msg) + "\n" + //); // VSCode necesita una respuesta con los breakpoints "verificados" response.body = { @@ -128,16 +162,55 @@ class MyLuaDebugSession extends LoggingDebugSession { cmd: "continue" }; - this.process.stdin.write( - "@@DEBUGCMD@@" + JSON.stringify(msg) + "\n" - ); + this.sendDebugCommand(msg); + //this.process.stdin.write( + // "@@DEBUGCMD@@" + JSON.stringify(msg) + "\n" + //); this.sendResponse(response); } + pauseRequest(response, args) { + this.sendDebugCommand({ cmd: "pause" }); + this.sendResponse(response); + } + + stackTraceRequest(response, args) { + // Pedimos al motor el stack trace + this.sendDebugCommand({ cmd: "stackTrace" }); + + // IMPORTANTE: el motor responde async, así que esperamos + // a que llegue el mensaje @@DEBUG@@ con type=stackTrace + + const check = () => { + if (this._stackFrames.length > 0) { + const frames = this._stackFrames; + this._stackFrames = []; + + response.body = { + stackFrames: frames.map((f, i) => ({ + id: i + 1, + name: f.name, + source: { path: f.file }, + line: f.line, + column: 1 + })), + totalFrames: frames.length + }; + + this.sendResponse(response); + } else { + setTimeout(check, 5); + } + }; + + check(); + } + disconnectRequest(response, args) { const msg = { cmd: "continue" }; // por si estaba pausado - this.process.stdin.write("@@DEBUGCMD@@" + JSON.stringify(msg) + "\n"); + this.sendDebugCommand(msg); + //this.process.stdin.write("@@DEBUGCMD@@" + JSON.stringify(msg) + "\n"); this.process.kill(); this.sendResponse(response);