Added variable types for the future (fix #66)

This commit is contained in:
WebFreak001 2016-07-10 17:05:56 +02:00
commit 2308f9f166
3 changed files with 34 additions and 21 deletions

View file

@ -14,6 +14,12 @@ export interface Stack {
line: number; line: number;
} }
export interface Variable {
name: string;
valueStr: string;
type: string;
}
export interface SSHArguments { export interface SSHArguments {
forwardX11: boolean; forwardX11: boolean;
host: string; host: string;
@ -46,7 +52,7 @@ export interface IBackend {
removeBreakPoint(breakpoint: Breakpoint): Thenable<boolean>; removeBreakPoint(breakpoint: Breakpoint): Thenable<boolean>;
clearBreakPoints(): Thenable<any>; clearBreakPoints(): Thenable<any>;
getStack(maxLevels: number): Thenable<Stack[]>; getStack(maxLevels: number): Thenable<Stack[]>;
getStackVariables(thread: number, frame: number): Thenable<[string, string][]>; getStackVariables(thread: number, frame: number): Thenable<Variable[]>;
evalExpression(name: string): Thenable<any>; evalExpression(name: string): Thenable<any>;
isReady(): boolean; isReady(): boolean;
changeVariable(name: string, rawValue: string): Thenable<any>; changeVariable(name: string, rawValue: string): Thenable<any>;

View file

@ -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 * as ChildProcess from "child_process"
import { EventEmitter } from "events" import { EventEmitter } from "events"
import { parseMI, MINode } from '../mi_parse'; 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<Variable[]> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.sendCommand("stack-list-variables --thread " + thread + " --frame " + frame + " --simple-values").then((result) => { this.sendCommand("stack-list-variables --thread " + thread + " --frame " + frame + " --simple-values").then((result) => {
let variables = result.result("variables"); let variables = result.result("variables");
let ret: [string, string][] = []; let ret: Variable[] = [];
variables.forEach(element => { variables.forEach(element => {
const key = MINode.valueOf(element, "name"); const key = MINode.valueOf(element, "name");
const value = MINode.valueOf(element, "value"); 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); resolve(ret);
}, reject); }, reject);

View file

@ -206,7 +206,7 @@ export class MI2DebugSession extends DebugSession {
} }
protected variablesRequest(response: DebugProtocol.VariablesResponse, args: DebugProtocol.VariablesArguments): void { protected variablesRequest(response: DebugProtocol.VariablesResponse, args: DebugProtocol.VariablesArguments): void {
const variables = []; const variables: DebugProtocol.Variable[] = [];
const id = this.variableHandles.get(args.variablesReference); const id = this.variableHandles.get(args.variablesReference);
let createVariable = (arg) => { let createVariable = (arg) => {
@ -217,24 +217,26 @@ export class MI2DebugSession extends DebugSession {
if (id.startsWith("@frame:")) { if (id.startsWith("@frame:")) {
this.miDebugger.getStackVariables(this.threadID, parseInt(id.substr("@frame:".length))).then(stack => { this.miDebugger.getStackVariables(this.threadID, parseInt(id.substr("@frame:".length))).then(stack => {
stack.forEach(variable => { stack.forEach(variable => {
if (variable[1] !== undefined) { if (variable.valueStr !== undefined) {
let expanded = expandValue(createVariable, "{" + variable[0] + "=" + variable[1] + ")"); let expanded = expandValue(createVariable, "{" + variable.name + "=" + variable.valueStr + ")");
if (!expanded) if (expanded)
new OutputEvent("Could not expand " + variable[1] + "\n", "stderr"); {
else if (typeof expanded[0] == "string") if (typeof expanded[0] == "string")
expanded = [ expanded = [
{ {
name: "<value>", name: "<value>",
value: prettyStringArray(expanded), value: prettyStringArray(expanded),
variablesReference: 0 variablesReference: 0
} }
]; ];
variables.push(expanded[0]); variables.push(expanded[0]);
}
} else } else
variables.push({ variables.push({
name: variable[0], name: variable.name,
type: variable.type,
value: "<unknown>", value: "<unknown>",
variablesReference: createVariable(variable[0]) variablesReference: createVariable(variable.name)
}); });
}); });
response.body = { response.body = {