debug.ts 7.9 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

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 = {
110 111
	STATE_CHANGED: 'StateChanged',
	TYPE_NOT_SUPPORTED: 'TypeNotSupported'
E
Erich Gamma 已提交
112 113 114 115 116 117 118 119 120 121 122 123
};

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

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

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

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

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

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

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

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

export interface IConfig {
162
	name?: string;
E
Erich Gamma 已提交
163 164
	type: string;
	request: string;
165 166 167 168 169 170 171 172 173 174 175 176 177 178
	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 已提交
179 180 181
}

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

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

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

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

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

	setFocusedStackFrameAndEvaluate(focusedStackFrame: IStackFrame): void;

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

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

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

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

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

I
isidor 已提交
269
// utils
E
Erich Gamma 已提交
270

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

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