diff --git a/src/backend/backend.ts b/src/backend/backend.ts index 532b6cb..344d1a2 100644 --- a/src/backend/backend.ts +++ b/src/backend/backend.ts @@ -14,6 +14,12 @@ export interface Stack { line: number; } +export interface Variable { + name: string; + valueStr: string; + type: string; +} + export interface SSHArguments { forwardX11: boolean; host: string; @@ -46,7 +52,7 @@ export interface IBackend { removeBreakPoint(breakpoint: Breakpoint): Thenable; clearBreakPoints(): Thenable; getStack(maxLevels: number): Thenable; - getStackVariables(thread: number, frame: number): Thenable<[string, string][]>; + getStackVariables(thread: number, frame: number): Thenable; evalExpression(name: string): Thenable; isReady(): boolean; changeVariable(name: string, rawValue: string): Thenable; diff --git a/src/backend/mi2/mi2.ts b/src/backend/mi2/mi2.ts index f0343cc..2b6cfbf 100644 --- a/src/backend/mi2/mi2.ts +++ b/src/backend/mi2/mi2.ts @@ -1,4 +1,4 @@ -import { Breakpoint, IBackend, Stack, SSHArguments } from "../backend.ts" +import { Breakpoint, IBackend, Stack, SSHArguments, Variable } from "../backend.ts" import * as ChildProcess from "child_process" import { EventEmitter } from "events" import { parseMI, MINode } from '../mi_parse'; @@ -536,15 +536,20 @@ export class MI2 extends EventEmitter implements IBackend { }); } - getStackVariables(thread: number, frame: number): Thenable<[string, string][]> { + getStackVariables(thread: number, frame: number): Thenable { return new Promise((resolve, reject) => { this.sendCommand("stack-list-variables --thread " + thread + " --frame " + frame + " --simple-values").then((result) => { let variables = result.result("variables"); - let ret: [string, string][] = []; + let ret: Variable[] = []; variables.forEach(element => { const key = MINode.valueOf(element, "name"); const value = MINode.valueOf(element, "value"); - ret.push([key, value]); + const type = MINode.valueOf(element, "type"); + ret.push({ + name: key, + valueStr: value, + type: type + }); }); resolve(ret); }, reject); diff --git a/src/mibase.ts b/src/mibase.ts index ba745bc..13ec0a3 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -206,7 +206,7 @@ export class MI2DebugSession extends DebugSession { } protected variablesRequest(response: DebugProtocol.VariablesResponse, args: DebugProtocol.VariablesArguments): void { - const variables = []; + const variables: DebugProtocol.Variable[] = []; const id = this.variableHandles.get(args.variablesReference); let createVariable = (arg) => { @@ -217,24 +217,26 @@ export class MI2DebugSession extends DebugSession { if (id.startsWith("@frame:")) { this.miDebugger.getStackVariables(this.threadID, parseInt(id.substr("@frame:".length))).then(stack => { stack.forEach(variable => { - if (variable[1] !== undefined) { - let expanded = expandValue(createVariable, "{" + variable[0] + "=" + variable[1] + ")"); - if (!expanded) - new OutputEvent("Could not expand " + variable[1] + "\n", "stderr"); - else if (typeof expanded[0] == "string") - expanded = [ - { - name: "", - value: prettyStringArray(expanded), - variablesReference: 0 - } - ]; - variables.push(expanded[0]); + if (variable.valueStr !== undefined) { + let expanded = expandValue(createVariable, "{" + variable.name + "=" + variable.valueStr + ")"); + if (expanded) + { + if (typeof expanded[0] == "string") + expanded = [ + { + name: "", + value: prettyStringArray(expanded), + variablesReference: 0 + } + ]; + variables.push(expanded[0]); + } } else variables.push({ - name: variable[0], + name: variable.name, + type: variable.type, value: "", - variablesReference: createVariable(variable[0]) + variablesReference: createVariable(variable.name) }); }); response.body = {