debug.ts 7.7 KB
Newer Older
E
Erich Gamma 已提交
1 2 3 4 5 6 7 8 9 10 11
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

import uri from 'vs/base/common/uri';
import { TPromise, Promise } from 'vs/base/common/winjs.base';
import ee = require('vs/base/common/eventEmitter');
import severity from 'vs/base/common/severity';
import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation';
import editor = require('vs/editor/common/editorCommon');
I
isidor 已提交
12
import editorbrowser = require('vs/editor/browser/editorBrowser');
I
isidor 已提交
13
import { Source } from 'vs/workbench/parts/debug/common/debugSource';
E
Erich Gamma 已提交
14

I
isidor 已提交
15 16 17 18
export const VIEWLET_ID = 'workbench.view.debug';
export const REPL_ID = 'workbench.panel.repl';
export const DEBUG_SERVICE_ID = 'debugService';
export const CONTEXT_IN_DEBUG_MODE = 'inDebugMode';
E
Erich Gamma 已提交
19

I
isidor 已提交
20
// raw
E
Erich Gamma 已提交
21 22 23 24 25

export interface IRawModelUpdate {
	threadId: number;
	thread?: DebugProtocol.Thread;
	callStack?: DebugProtocol.StackFrame[];
I
isidor 已提交
26
	stoppedReason?: string;
E
Erich Gamma 已提交
27 28
}

I
isidor 已提交
29
// model
E
Erich Gamma 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42

export interface ITreeElement {
	getId(): string;
}

export interface IExpressionContainer extends ITreeElement {
	reference: number;
	getChildren(debugService: IDebugService): TPromise<IExpression[]>;
}

export interface IExpression extends ITreeElement, IExpressionContainer {
	name: string;
	value: string;
43
	valueChanged: boolean;
E
Erich Gamma 已提交
44 45 46 47 48 49
}

export interface IThread extends ITreeElement {
	threadId: number;
	name: string;
	callStack: IStackFrame[];
I
isidor 已提交
50
	stoppedReason: string;
E
Erich Gamma 已提交
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
}

export interface IScope extends IExpressionContainer {
	name: string;
	expensive: boolean;
}

export interface IStackFrame extends ITreeElement {
	threadId: number;
	name: string;
	lineNumber: number;
	column: number;
	frameId: number;
	source: Source;
	getScopes(debugService: IDebugService): TPromise<IScope[]>;
}

export interface IEnablement extends ITreeElement {
	enabled: boolean;
}

72 73 74 75 76 77 78
export interface IRawBreakpoint {
	uri: uri;
	lineNumber: number;
	enabled: boolean;
	condition?: string;
}

E
Erich Gamma 已提交
79 80 81 82
export interface IBreakpoint extends IEnablement {
	source: Source;
	lineNumber: number;
	desiredLineNumber: number;
I
isidor 已提交
83
	condition: string;
84
	verified: boolean;
E
Erich Gamma 已提交
85 86
}

I
isidor 已提交
87
export interface IFunctionBreakpoint extends IEnablement {
88
	name: string;
I
isidor 已提交
89 90
}

E
Erich Gamma 已提交
91 92 93 94
export interface IExceptionBreakpoint extends IEnablement {
	name: string;
}

I
isidor 已提交
95
// events
E
Erich Gamma 已提交
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

export var ModelEvents = {
	BREAKPOINTS_UPDATED: 'BreakpointsUpdated',
	CALLSTACK_UPDATED: 'CallStackUpdated',
	WATCH_EXPRESSIONS_UPDATED: 'WatchExpressionsUpdated',
	REPL_ELEMENTS_UPDATED: 'ReplElementsUpdated'
};

export var ViewModelEvents = {
	FOCUSED_STACK_FRAME_UPDATED: 'FocusedStackFrameUpdated',
	SELECTED_EXPRESSION_UPDATED: 'SelectedExpressionUpdated'
};

export var ServiceEvents = {
	STATE_CHANGED: 'StateChanged'
};

export var SessionEvents = {
	INITIALIZED: 'initialized',
	STOPPED: 'stopped',
	DEBUGEE_TERMINATED: 'terminated',
	SERVER_EXIT: 'exit',
	CONTINUED: 'continued',
	THREAD: 'thread',
	OUTPUT: 'output'
};

I
isidor 已提交
123
// model interfaces
E
Erich Gamma 已提交
124 125 126 127 128 129 130 131 132

export interface IViewModel extends ee.EventEmitter {
	getFocusedStackFrame(): IStackFrame;
	getSelectedExpression(): IExpression;
	getFocusedThreadId(): number;
	setSelectedExpression(expression: IExpression);
}

export interface IModel extends ee.IEventEmitter, ITreeElement {
133
	getThreads(): { [threadId: number]: IThread; };
E
Erich Gamma 已提交
134 135
	getBreakpoints(): IBreakpoint[];
	areBreakpointsActivated(): boolean;
I
isidor 已提交
136
	getFunctionBreakpoints(): IFunctionBreakpoint[];
E
Erich Gamma 已提交
137 138 139 140 141
	getExceptionBreakpoints(): IExceptionBreakpoint[];
	getWatchExpressions(): IExpression[];
	getReplElements(): ITreeElement[];
}

I
isidor 已提交
142
// service enums
E
Erich Gamma 已提交
143 144 145 146 147 148 149 150 151

export enum State {
	Disabled,
	Inactive,
	Initializing,
	Stopped,
	Running
}

I
isidor 已提交
152
// service interfaces
E
Erich Gamma 已提交
153 154 155

export interface IGlobalConfig {
	version: string;
156
	debugServer?: number;
E
Erich Gamma 已提交
157 158 159 160
	configurations: IConfig[];
}

export interface IConfig {
161
	name?: string;
E
Erich Gamma 已提交
162 163
	type: string;
	request: string;
164 165 166 167 168 169 170 171 172 173 174 175 176 177
	program?: string;
	stopOnEntry?: boolean;
	args?: string[];
	cwd?: string;
	runtimeExecutable?: string;
	runtimeArgs?: string[];
	env?: { [key: string]: string; };
	sourceMaps?: boolean;
	outDir?: string;
	address?: string;
	port?: number;
	preLaunchTask?: string;
	externalConsole?: boolean;
	debugServer?: number;
E
Erich Gamma 已提交
178 179 180
}

export interface IRawEnvAdapter {
I
isidor 已提交
181 182 183 184 185 186
	type?: string;
	label?: string;
	program?: string;
	args?: string[];
	runtime?: string;
	runtimeArgs?: string[];
E
Erich Gamma 已提交
187 188 189
}

export interface IRawAdapter extends IRawEnvAdapter {
I
isidor 已提交
190 191 192 193
	enableBreakpointsFor?: { languageIds: string[] };
	configurationAttributes?: any;
	initialConfigurations?: any[];
	win?: IRawEnvAdapter;
194
	windows?: IRawEnvAdapter;
I
isidor 已提交
195 196
	osx?: IRawEnvAdapter;
	linux?: IRawEnvAdapter;
E
Erich Gamma 已提交
197 198 199
}

export interface IRawDebugSession extends ee.EventEmitter {
I
isidor 已提交
200
	getType(): string;
201
	isAttach: boolean;
202
	disconnect(restart?: boolean, force?: boolean): TPromise<DebugProtocol.DisconnectResponse>;
E
Erich Gamma 已提交
203

204
	next(args: DebugProtocol.NextArguments): TPromise<DebugProtocol.NextResponse>;
E
Erich Gamma 已提交
205 206 207 208 209 210
	stepIn(args: DebugProtocol.StepInArguments): TPromise<DebugProtocol.StepInResponse>;
	stepOut(args: DebugProtocol.StepOutArguments): TPromise<DebugProtocol.StepOutResponse>;
	continue(args: DebugProtocol.ContinueArguments): TPromise<DebugProtocol.ContinueResponse>;
	pause(args: DebugProtocol.PauseArguments): TPromise<DebugProtocol.PauseResponse>;

	scopes(args: DebugProtocol.ScopesArguments): TPromise<DebugProtocol.ScopesResponse>;
211
	variables(args: DebugProtocol.VariablesArguments): TPromise<DebugProtocol.VariablesResponse>;
E
Erich Gamma 已提交
212 213 214 215 216 217 218 219 220 221
	evaluate(args: DebugProtocol.EvaluateArguments): TPromise<DebugProtocol.EvaluateResponse>;
}

export var IDebugService = createDecorator<IDebugService>(DEBUG_SERVICE_ID);

export interface IDebugService extends ee.IEventEmitter {
	serviceId: ServiceIdentifier<any>;
	getState(): State;
	canSetBreakpointsIn(model: editor.IModel, lineNumber: number): boolean;

222
	getConfigurationName(): string;
E
Erich Gamma 已提交
223
	setConfiguration(name: string): Promise;
224
	openConfigFile(sideBySide: boolean): TPromise<boolean>;
E
Erich Gamma 已提交
225 226 227 228
	loadLaunchConfig(): TPromise<IGlobalConfig>;

	setFocusedStackFrameAndEvaluate(focusedStackFrame: IStackFrame): void;

229 230
	setBreakpointsForModel(modelUri: uri, data: IRawBreakpoint[]): Promise;
	toggleBreakpoint(IRawBreakpoint): Promise;
E
Erich Gamma 已提交
231 232 233
	enableOrDisableAllBreakpoints(enabled: boolean): Promise;
	toggleEnablement(element: IEnablement): Promise;
	toggleBreakpointsActivated(): Promise;
234
	removeAllBreakpoints(): Promise;
E
Erich Gamma 已提交
235
	sendAllBreakpoints(): Promise;
I
isidor 已提交
236
	editBreakpoint(editor: editorbrowser.ICodeEditor, lineNumber: number): Promise;
I
isidor 已提交
237

238
	addFunctionBreakpoint(functionName?: string): Promise;
I
isidor 已提交
239
	renameFunctionBreakpoint(id: string, newFunctionName: string): Promise;
240
	removeFunctionBreakpoints(id?: string): Promise;
E
Erich Gamma 已提交
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255

	addReplExpression(name: string): Promise;
	clearReplExpressions(): void;

	logToRepl(value: string, severity?: severity): void;
	logToRepl(value: { [key: string]: any }, severity?: severity): void;

	appendReplOutput(value: string, severity?: severity): void;

	addWatchExpression(name?: string): Promise;
	renameWatchExpression(id: string, newName: string): Promise;
	clearWatchExpressions(id?: string): void;

	createSession(): Promise;
	restartSession(): Promise;
256
	rawAttach(port: number): Promise;
E
Erich Gamma 已提交
257 258 259 260 261 262 263 264 265
	getActiveSession(): IRawDebugSession;

	getModel(): IModel;
	getViewModel(): IViewModel;

	openOrRevealEditor(source: Source, lineNumber: number, preserveFocus: boolean, sideBySide: boolean): Promise;
	revealRepl(inBackground?:boolean): Promise;
}

I
isidor 已提交
266
// utils
E
Erich Gamma 已提交
267

I
isidor 已提交
268
const _formatPIIRegexp = /{([^}]+)}/g;
E
Erich Gamma 已提交
269 270 271 272 273 274 275 276 277 278 279 280

export function formatPII(value:string, excludePII: boolean, args: {[key: string]: string}): string {
	return value.replace(_formatPIIRegexp, function(match, group) {
		if (excludePII && group.length > 0 && group[0] !== '_') {
			return match;
		}

		return args.hasOwnProperty(group) ?
			args[group] :
			match;
	})
}