debug.ts 7.8 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
	capablities: DebugProtocol.Capabilites;
203
	disconnect(restart?: boolean, force?: boolean): TPromise<DebugProtocol.DisconnectResponse>;
E
Erich Gamma 已提交
204

205
	next(args: DebugProtocol.NextArguments): TPromise<DebugProtocol.NextResponse>;
E
Erich Gamma 已提交
206 207 208 209 210 211
	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>;
212
	variables(args: DebugProtocol.VariablesArguments): TPromise<DebugProtocol.VariablesResponse>;
E
Erich Gamma 已提交
213 214 215 216 217 218 219 220 221 222
	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;

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

	setFocusedStackFrameAndEvaluate(focusedStackFrame: IStackFrame): void;

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

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

	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;
257
	rawAttach(port: number): Promise;
E
Erich Gamma 已提交
258 259 260 261 262 263 264 265 266
	getActiveSession(): IRawDebugSession;

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

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

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

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

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;
	})
}