extHost.api.impl.ts 50.4 KB
Newer Older
E
Erich Gamma 已提交
1 2 3 4 5
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

A
Alex Dima 已提交
6 7 8
import { localize } from 'vs/nls';
import { CancellationTokenSource } from 'vs/base/common/cancellation';
import * as errors from 'vs/base/common/errors';
J
Joao Moreno 已提交
9
import { Emitter, Event } from 'vs/base/common/event';
10
import { TernarySearchTree } from 'vs/base/common/map';
11
import * as path from 'vs/base/common/path';
A
Alex Dima 已提交
12 13 14 15 16 17 18
import Severity from 'vs/base/common/severity';
import { URI } from 'vs/base/common/uri';
import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions';
import { OverviewRulerLane } from 'vs/editor/common/model';
import * as languageConfiguration from 'vs/editor/common/modes/languageConfiguration';
import { score } from 'vs/editor/common/modes/languageSelector';
import * as files from 'vs/platform/files/common/files';
A
Alex Dima 已提交
19
import { ExtHostContext, IInitData, IMainContext, MainContext, MainThreadKeytarShape } from 'vs/workbench/api/common/extHost.protocol';
J
Johannes Rieken 已提交
20 21 22 23 24
import { ExtHostApiCommands } from 'vs/workbench/api/common/extHostApiCommands';
import { ExtHostClipboard } from 'vs/workbench/api/common/extHostClipboard';
import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands';
import { ExtHostComments } from 'vs/workbench/api/common/extHostComments';
import { ExtHostConfiguration, ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration';
A
Alex Dima 已提交
25
import { ExtHostDebugService } from 'vs/workbench/api/node/extHostDebugService';
J
Johannes Rieken 已提交
26 27 28 29 30 31 32
import { ExtHostDecorations } from 'vs/workbench/api/common/extHostDecorations';
import { ExtHostDiagnostics } from 'vs/workbench/api/common/extHostDiagnostics';
import { ExtHostDialogs } from 'vs/workbench/api/common/extHostDialogs';
import { ExtHostDocumentContentProvider } from 'vs/workbench/api/common/extHostDocumentContentProviders';
import { ExtHostDocumentSaveParticipant } from 'vs/workbench/api/common/extHostDocumentSaveParticipant';
import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments';
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors';
A
Alex Dima 已提交
33 34
import { ExtensionActivatedByAPI } from 'vs/workbench/api/node/extHostExtensionActivator';
import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService';
J
Johannes Rieken 已提交
35 36 37 38 39
import { ExtHostFileSystem } from 'vs/workbench/api/common/extHostFileSystem';
import { ExtHostFileSystemEventService } from 'vs/workbench/api/common/extHostFileSystemEventService';
import { ExtHostHeapService } from 'vs/workbench/api/common/extHostHeapService';
import { ExtHostLanguageFeatures, ISchemeTransformer } from 'vs/workbench/api/common/extHostLanguageFeatures';
import { ExtHostLanguages } from 'vs/workbench/api/common/extHostLanguages';
A
Alex Dima 已提交
40
import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService';
J
Johannes Rieken 已提交
41
import { ExtHostMessageService } from 'vs/workbench/api/common/extHostMessageService';
A
Alex Dima 已提交
42
import { ExtHostOutputService } from 'vs/workbench/api/node/extHostOutputService';
J
Johannes Rieken 已提交
43 44 45
import { ExtHostProgress } from 'vs/workbench/api/common/extHostProgress';
import { ExtHostQuickOpen } from 'vs/workbench/api/common/extHostQuickOpen';
import { ExtHostSCM } from 'vs/workbench/api/common/extHostSCM';
A
Alex Dima 已提交
46
import { ExtHostSearch } from 'vs/workbench/api/node/extHostSearch';
J
Johannes Rieken 已提交
47 48
import { ExtHostStatusBar } from 'vs/workbench/api/common/extHostStatusBar';
import { ExtHostStorage } from 'vs/workbench/api/common/extHostStorage';
A
Alex Dima 已提交
49
import { ExtHostTask } from 'vs/workbench/api/node/extHostTask';
J
Johannes Rieken 已提交
50
import { ExtHostTerminalService } from 'vs/workbench/api/node/extHostTerminalService';
J
Johannes Rieken 已提交
51 52 53 54 55 56 57 58
import { ExtHostEditors } from 'vs/workbench/api/common/extHostTextEditors';
import { ExtHostTreeViews } from 'vs/workbench/api/common/extHostTreeViews';
import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters';
import * as extHostTypes from 'vs/workbench/api/common/extHostTypes';
import { ExtHostUrls } from 'vs/workbench/api/common/extHostUrls';
import { ExtHostWebviews } from 'vs/workbench/api/common/extHostWebview';
import { ExtHostWindow } from 'vs/workbench/api/common/extHostWindow';
import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace';
59
import { throwProposedApiError, checkProposedApiEnabled, nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions';
J
Johannes Rieken 已提交
60
import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier';
A
Alex Dima 已提交
61
import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/node/extensionDescriptionRegistry';
A
Alex Dima 已提交
62
import * as vscode from 'vscode';
63
import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions';
64
import { originalFSPath } from 'vs/base/common/resources';
65
import { CLIServer } from 'vs/workbench/api/node/extHostCLIServer';
66
import { withNullAsUndefined } from 'vs/base/common/types';
J
Johannes Rieken 已提交
67
import { values } from 'vs/base/common/collections';
E
Erich Gamma 已提交
68

69
export interface IExtensionApiFactory {
70
	(extension: IExtensionDescription, registry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode;
71 72
}

73
function proposedApiFunction<T>(extension: IExtensionDescription, fn: T): T {
74
	if (extension.enableProposedApi) {
75 76
		return fn;
	} else {
77
		return throwProposedApiError.bind(null, extension) as any as T;
78 79 80
	}
}

E
Erich Gamma 已提交
81
/**
82
 * This method instantiates and returns the extension API surface
E
Erich Gamma 已提交
83
 */
84 85
export function createApiFactory(
	initData: IInitData,
86
	rpcProtocol: IMainContext,
87 88
	extHostWorkspace: ExtHostWorkspace,
	extHostConfiguration: ExtHostConfiguration,
J
Joao Moreno 已提交
89
	extensionService: ExtHostExtensionService,
90 91
	extHostLogService: ExtHostLogService,
	extHostStorage: ExtHostStorage
92
): IExtensionApiFactory {
93

94
	const schemeTransformer: ISchemeTransformer | null = null;
A
Alex Dima 已提交
95

96
	// Addressable instances
97
	rpcProtocol.set(ExtHostContext.ExtHostLogService, extHostLogService);
A
Alex Dima 已提交
98 99
	const extHostHeapService = rpcProtocol.set(ExtHostContext.ExtHostHeapService, new ExtHostHeapService());
	const extHostDecorations = rpcProtocol.set(ExtHostContext.ExtHostDecorations, new ExtHostDecorations(rpcProtocol));
M
Matt Bierner 已提交
100
	const extHostWebviews = rpcProtocol.set(ExtHostContext.ExtHostWebviews, new ExtHostWebviews(rpcProtocol));
J
Joao Moreno 已提交
101
	const extHostUrls = rpcProtocol.set(ExtHostContext.ExtHostUrls, new ExtHostUrls(rpcProtocol));
102
	const extHostDocumentsAndEditors = rpcProtocol.set(ExtHostContext.ExtHostDocumentsAndEditors, new ExtHostDocumentsAndEditors(rpcProtocol));
A
Alex Dima 已提交
103
	const extHostDocuments = rpcProtocol.set(ExtHostContext.ExtHostDocuments, new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors));
104
	const extHostDocumentContentProviders = rpcProtocol.set(ExtHostContext.ExtHostDocumentContentProviders, new ExtHostDocumentContentProvider(rpcProtocol, extHostDocumentsAndEditors, extHostLogService));
105
	const extHostDocumentSaveParticipant = rpcProtocol.set(ExtHostContext.ExtHostDocumentSaveParticipant, new ExtHostDocumentSaveParticipant(extHostLogService, extHostDocuments, rpcProtocol.getProxy(MainContext.MainThreadTextEditors)));
A
Alex Dima 已提交
106
	const extHostEditors = rpcProtocol.set(ExtHostContext.ExtHostEditors, new ExtHostEditors(rpcProtocol, extHostDocumentsAndEditors));
107
	const extHostCommands = rpcProtocol.set(ExtHostContext.ExtHostCommands, new ExtHostCommands(rpcProtocol, extHostHeapService, extHostLogService));
S
Sandeep Somavarapu 已提交
108
	const extHostTreeViews = rpcProtocol.set(ExtHostContext.ExtHostTreeViews, new ExtHostTreeViews(rpcProtocol.getProxy(MainContext.MainThreadTreeViews), extHostCommands, extHostLogService));
A
Alex Dima 已提交
109 110 111
	rpcProtocol.set(ExtHostContext.ExtHostWorkspace, extHostWorkspace);
	rpcProtocol.set(ExtHostContext.ExtHostConfiguration, extHostConfiguration);
	const extHostDiagnostics = rpcProtocol.set(ExtHostContext.ExtHostDiagnostics, new ExtHostDiagnostics(rpcProtocol));
112
	const extHostLanguageFeatures = rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, new ExtHostLanguageFeatures(rpcProtocol, schemeTransformer, extHostDocuments, extHostCommands, extHostHeapService, extHostDiagnostics, extHostLogService));
113
	const extHostFileSystem = rpcProtocol.set(ExtHostContext.ExtHostFileSystem, new ExtHostFileSystem(rpcProtocol, extHostLanguageFeatures));
114
	const extHostFileSystemEvent = rpcProtocol.set(ExtHostContext.ExtHostFileSystemEventService, new ExtHostFileSystemEventService(rpcProtocol, extHostDocumentsAndEditors));
A
Alex Dima 已提交
115
	const extHostQuickOpen = rpcProtocol.set(ExtHostContext.ExtHostQuickOpen, new ExtHostQuickOpen(rpcProtocol, extHostWorkspace, extHostCommands));
116
	const extHostTerminalService = rpcProtocol.set(ExtHostContext.ExtHostTerminalService, new ExtHostTerminalService(rpcProtocol, extHostConfiguration, extHostLogService));
117
	const extHostDebugService = rpcProtocol.set(ExtHostContext.ExtHostDebugService, new ExtHostDebugService(rpcProtocol, extHostWorkspace, extensionService, extHostDocumentsAndEditors, extHostConfiguration, extHostTerminalService, extHostCommands));
118
	const extHostSCM = rpcProtocol.set(ExtHostContext.ExtHostSCM, new ExtHostSCM(rpcProtocol, extHostCommands, extHostLogService));
P
Peng Lyu 已提交
119
	const extHostComment = rpcProtocol.set(ExtHostContext.ExtHostComments, new ExtHostComments(rpcProtocol, extHostCommands, extHostDocuments));
R
Rob Lourens 已提交
120
	const extHostSearch = rpcProtocol.set(ExtHostContext.ExtHostSearch, new ExtHostSearch(rpcProtocol, schemeTransformer, extHostLogService));
121
	const extHostTask = rpcProtocol.set(ExtHostContext.ExtHostTask, new ExtHostTask(rpcProtocol, extHostWorkspace, extHostDocumentsAndEditors, extHostConfiguration, extHostTerminalService));
A
Alex Dima 已提交
122 123
	const extHostWindow = rpcProtocol.set(ExtHostContext.ExtHostWindow, new ExtHostWindow(rpcProtocol));
	rpcProtocol.set(ExtHostContext.ExtHostExtensionService, extensionService);
124
	const extHostProgress = rpcProtocol.set(ExtHostContext.ExtHostProgress, new ExtHostProgress(rpcProtocol.getProxy(MainContext.MainThreadProgress)));
125
	const extHostOutputService = rpcProtocol.set(ExtHostContext.ExtHostOutputService, new ExtHostOutputService(initData.logsLocation, rpcProtocol));
126
	rpcProtocol.set(ExtHostContext.ExtHostStorage, extHostStorage);
127 128 129 130
	if (initData.remoteAuthority) {
		const cliServer = new CLIServer(extHostCommands);
		process.env['VSCODE_IPC_HOOK_CLI'] = cliServer.ipcHandlePath;
	}
131 132

	// Check that no named customers are missing
J
Johannes Rieken 已提交
133
	const expected: ProxyIdentifier<any>[] = values(ExtHostContext);
A
Alex Dima 已提交
134
	rpcProtocol.assertRegistered(expected);
135

136
	// Other instances
137
	const extHostClipboard = new ExtHostClipboard(rpcProtocol);
A
Alex Dima 已提交
138 139 140
	const extHostMessageService = new ExtHostMessageService(rpcProtocol);
	const extHostDialogs = new ExtHostDialogs(rpcProtocol);
	const extHostStatusBar = new ExtHostStatusBar(rpcProtocol);
141
	const extHostLanguages = new ExtHostLanguages(rpcProtocol, extHostDocuments);
142

143
	// Register an output channel for exthost log
A
Tweaks  
Alex Dima 已提交
144 145
	const name = localize('extensionsLog', "Extension Host");
	extHostOutputService.createOutputChannelFromLogFile(name, extHostLogService.logFile);
146

147
	// Register API-ish commands
148
	ExtHostApiCommands.register(extHostCommands);
149

150
	return function (extension: IExtensionDescription, extensionRegistry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode {
151

152 153 154 155 156
		// Check document selectors for being overly generic. Technically this isn't a problem but
		// in practice many extensions say they support `fooLang` but need fs-access to do so. Those
		// extension should specify then the `file`-scheme, e.g `{ scheme: 'fooLang', language: 'fooLang' }`
		// We only inform once, it is not a warning because we just want to raise awareness and because
		// we cannot say if the extension is doing it right or wrong...
157
		const checkSelector = (function () {
A
Alex Dima 已提交
158
			let done = (!extension.isUnderDevelopment);
159 160
			function informOnce(selector: vscode.DocumentSelector) {
				if (!done) {
161
					console.info(`Extension '${extension.identifier.value}' uses a document selector without scheme. Learn more about this: https://go.microsoft.com/fwlink/?linkid=872305`);
162 163
					done = true;
				}
164
			}
165
			return function perform(selector: vscode.DocumentSelector): vscode.DocumentSelector {
166 167 168 169 170 171 172 173 174 175
				if (Array.isArray(selector)) {
					selector.forEach(perform);
				} else if (typeof selector === 'string') {
					informOnce(selector);
				} else {
					if (typeof selector.scheme === 'undefined') {
						informOnce(selector);
					}
					if (!extension.enableProposedApi && typeof selector.exclusive === 'boolean') {
						throwProposedApiError(extension);
176 177 178 179 180
					}
				}
				return selector;
			};
		})();
181

182

183 184
		// namespace: commands
		const commands: typeof vscode.commands = {
M
Matt Bierner 已提交
185
			registerCommand(id: string, command: <T>(...args: any[]) => T | Thenable<T>, thisArgs?: any): vscode.Disposable {
186
				return extHostCommands.registerCommand(true, id, command, thisArgs);
187
			},
188
			registerTextEditorCommand(id: string, callback: (textEditor: vscode.TextEditor, edit: vscode.TextEditorEdit, ...args: any[]) => void, thisArg?: any): vscode.Disposable {
189
				return extHostCommands.registerCommand(true, id, (...args: any[]): any => {
190
					const activeTextEditor = extHostEditors.getActiveTextEditor();
191 192
					if (!activeTextEditor) {
						console.warn('Cannot execute ' + id + ' because there is no active text editor.');
193
						return undefined;
194
					}
195 196 197 198 199 200 201 202 203 204

					return activeTextEditor.edit((edit: vscode.TextEditorEdit) => {
						args.unshift(activeTextEditor, edit);
						callback.apply(thisArg, args);

					}).then((result) => {
						if (!result) {
							console.warn('Edits from command ' + id + ' were not applied.');
						}
					}, (err) => {
205
						console.warn('An error occurred while running command ' + id, err);
206
					});
207
				});
208 209
			},
			registerDiffInformationCommand: proposedApiFunction(extension, (id: string, callback: (diff: vscode.LineChange[], ...args: any[]) => any, thisArg?: any): vscode.Disposable => {
210
				return extHostCommands.registerCommand(true, id, async (...args: any[]): Promise<any> => {
211
					const activeTextEditor = extHostEditors.getActiveTextEditor();
212 213 214 215 216 217 218 219
					if (!activeTextEditor) {
						console.warn('Cannot execute ' + id + ' because there is no active text editor.');
						return undefined;
					}

					const diff = await extHostEditors.getDiffInformation(activeTextEditor.id);
					callback.apply(thisArg, [diff, ...args]);
				});
220
			}),
221
			executeCommand<T>(id: string, ...args: any[]): Thenable<T> {
M
Matt Bierner 已提交
222
				return extHostCommands.executeCommand<T>(id, ...args);
223
			},
224 225 226
			getCommands(filterInternal: boolean = false): Thenable<string[]> {
				return extHostCommands.getCommands(filterInternal);
			}
227
		};
228

229 230
		// namespace: env
		const env: typeof vscode.env = Object.freeze({
231 232
			get machineId() { return initData.telemetryInfo.machineId; },
			get sessionId() { return initData.telemetryInfo.sessionId; },
233 234
			get language() { return initData.environment.appLanguage; },
			get appName() { return initData.environment.appName; },
235
			get appRoot() { return initData.environment.appRoot!.fsPath; },
236
			get uriScheme() { return initData.environment.appUriScheme; },
237 238
			get logLevel() {
				checkProposedApiEnabled(extension);
239
				return typeConverters.LogLevel.to(extHostLogService.getLevel());
240 241 242
			},
			get onDidChangeLogLevel() {
				checkProposedApiEnabled(extension);
J
Joao Moreno 已提交
243
				return Event.map(extHostLogService.onDidChangeLogLevel, l => typeConverters.LogLevel.to(l));
244 245 246
			},
			get clipboard(): vscode.Clipboard {
				return extHostClipboard;
247
			},
J
Johannes Rieken 已提交
248
			openExternal(uri: URI) {
249
				return extHostWindow.openUri(uri);
250
			}
251
		});
E
Erich Gamma 已提交
252

253 254
		// namespace: extensions
		const extensions: typeof vscode.extensions = {
255 256
			getExtension(extensionId: string): Extension<any> | undefined {
				const desc = extensionRegistry.getExtensionDescription(extensionId);
257 258 259
				if (desc) {
					return new Extension(extensionService, desc);
				}
260
				return undefined;
261 262
			},
			get all(): Extension<any>[] {
A
Alex Dima 已提交
263
				return extensionRegistry.getAllExtensionDescriptions().map((desc) => new Extension(extensionService, desc));
264 265 266
			},
			get onDidChange() {
				return extensionRegistry.onDidChange;
E
Erich Gamma 已提交
267
			}
268
		};
E
Erich Gamma 已提交
269

270 271 272 273 274
		// namespace: languages
		const languages: typeof vscode.languages = {
			createDiagnosticCollection(name?: string): vscode.DiagnosticCollection {
				return extHostDiagnostics.createDiagnosticCollection(name);
			},
275 276 277
			get onDidChangeDiagnostics() {
				return extHostDiagnostics.onDidChangeDiagnostics;
			},
A
Alex Dima 已提交
278
			getDiagnostics: (resource?: vscode.Uri) => {
279 280
				return <any>extHostDiagnostics.getDiagnostics(resource);
			},
281
			getLanguages(): Thenable<string[]> {
282 283
				return extHostLanguages.getLanguages();
			},
284
			setTextDocumentLanguage(document: vscode.TextDocument, languageId: string): Thenable<vscode.TextDocument> {
M
mechatroner 已提交
285
				return extHostLanguages.changeLanguage(document.uri, languageId);
286
			},
287
			match(selector: vscode.DocumentSelector, document: vscode.TextDocument): number {
288
				return score(typeConverters.LanguageSelector.from(selector), document.uri, document.languageId, true);
289
			},
290
			registerCodeActionsProvider(selector: vscode.DocumentSelector, provider: vscode.CodeActionProvider, metadata?: vscode.CodeActionProviderMetadata): vscode.Disposable {
291
				return extHostLanguageFeatures.registerCodeActionProvider(extension, checkSelector(selector), provider, metadata);
292 293
			},
			registerCodeLensProvider(selector: vscode.DocumentSelector, provider: vscode.CodeLensProvider): vscode.Disposable {
294
				return extHostLanguageFeatures.registerCodeLensProvider(extension, checkSelector(selector), provider);
295
			},
R
Rob DeLine 已提交
296
			registerCodeInsetProvider(selector: vscode.DocumentSelector, provider: vscode.CodeInsetProvider): vscode.Disposable {
297
				checkProposedApiEnabled(extension);
R
Rob DeLine 已提交
298 299
				return extHostLanguageFeatures.registerCodeInsetProvider(extension, checkSelector(selector), provider);
			},
300
			registerDefinitionProvider(selector: vscode.DocumentSelector, provider: vscode.DefinitionProvider): vscode.Disposable {
301
				return extHostLanguageFeatures.registerDefinitionProvider(extension, checkSelector(selector), provider);
302
			},
303 304 305
			registerDeclarationProvider(selector: vscode.DocumentSelector, provider: vscode.DeclarationProvider): vscode.Disposable {
				return extHostLanguageFeatures.registerDeclarationProvider(extension, checkSelector(selector), provider);
			},
M
Matt Bierner 已提交
306
			registerImplementationProvider(selector: vscode.DocumentSelector, provider: vscode.ImplementationProvider): vscode.Disposable {
307
				return extHostLanguageFeatures.registerImplementationProvider(extension, checkSelector(selector), provider);
308
			},
309
			registerTypeDefinitionProvider(selector: vscode.DocumentSelector, provider: vscode.TypeDefinitionProvider): vscode.Disposable {
310
				return extHostLanguageFeatures.registerTypeDefinitionProvider(extension, checkSelector(selector), provider);
311
			},
312
			registerHoverProvider(selector: vscode.DocumentSelector, provider: vscode.HoverProvider): vscode.Disposable {
313
				return extHostLanguageFeatures.registerHoverProvider(extension, checkSelector(selector), provider, extension.identifier);
314 315
			},
			registerDocumentHighlightProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentHighlightProvider): vscode.Disposable {
316
				return extHostLanguageFeatures.registerDocumentHighlightProvider(extension, checkSelector(selector), provider);
317 318
			},
			registerReferenceProvider(selector: vscode.DocumentSelector, provider: vscode.ReferenceProvider): vscode.Disposable {
319
				return extHostLanguageFeatures.registerReferenceProvider(extension, checkSelector(selector), provider);
320 321
			},
			registerRenameProvider(selector: vscode.DocumentSelector, provider: vscode.RenameProvider): vscode.Disposable {
322
				return extHostLanguageFeatures.registerRenameProvider(extension, checkSelector(selector), provider);
323
			},
324 325
			registerDocumentSymbolProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentSymbolProvider, metadata?: vscode.DocumentSymbolProviderMetadata): vscode.Disposable {
				return extHostLanguageFeatures.registerDocumentSymbolProvider(extension, checkSelector(selector), provider, metadata);
326 327
			},
			registerWorkspaceSymbolProvider(provider: vscode.WorkspaceSymbolProvider): vscode.Disposable {
328
				return extHostLanguageFeatures.registerWorkspaceSymbolProvider(extension, provider);
329 330
			},
			registerDocumentFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentFormattingEditProvider): vscode.Disposable {
331
				return extHostLanguageFeatures.registerDocumentFormattingEditProvider(extension, checkSelector(selector), provider);
332 333
			},
			registerDocumentRangeFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentRangeFormattingEditProvider): vscode.Disposable {
334
				return extHostLanguageFeatures.registerDocumentRangeFormattingEditProvider(extension, checkSelector(selector), provider);
335 336
			},
			registerOnTypeFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.OnTypeFormattingEditProvider, firstTriggerCharacter: string, ...moreTriggerCharacters: string[]): vscode.Disposable {
337
				return extHostLanguageFeatures.registerOnTypeFormattingEditProvider(extension, checkSelector(selector), provider, [firstTriggerCharacter].concat(moreTriggerCharacters));
338
			},
339 340
			registerSignatureHelpProvider(selector: vscode.DocumentSelector, provider: vscode.SignatureHelpProvider, firstItem?: string | vscode.SignatureHelpProviderMetadata, ...remaining: string[]): vscode.Disposable {
				if (typeof firstItem === 'object') {
341
					return extHostLanguageFeatures.registerSignatureHelpProvider(extension, checkSelector(selector), provider, firstItem);
342
				}
343
				return extHostLanguageFeatures.registerSignatureHelpProvider(extension, checkSelector(selector), provider, typeof firstItem === 'undefined' ? [] : [firstItem, ...remaining]);
344 345
			},
			registerCompletionItemProvider(selector: vscode.DocumentSelector, provider: vscode.CompletionItemProvider, ...triggerCharacters: string[]): vscode.Disposable {
346
				return extHostLanguageFeatures.registerCompletionItemProvider(extension, checkSelector(selector), provider, triggerCharacters);
347 348
			},
			registerDocumentLinkProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentLinkProvider): vscode.Disposable {
349
				return extHostLanguageFeatures.registerDocumentLinkProvider(extension, checkSelector(selector), provider);
350
			},
351
			registerColorProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentColorProvider): vscode.Disposable {
352
				return extHostLanguageFeatures.registerColorProvider(extension, checkSelector(selector), provider);
353
			},
354
			registerFoldingRangeProvider(selector: vscode.DocumentSelector, provider: vscode.FoldingRangeProvider): vscode.Disposable {
355
				return extHostLanguageFeatures.registerFoldingRangeProvider(extension, checkSelector(selector), provider);
356
			},
357 358 359
			registerSelectionRangeProvider(selector: vscode.DocumentSelector, provider: vscode.SelectionRangeProvider): vscode.Disposable {
				return extHostLanguageFeatures.registerSelectionRangeProvider(extension, selector, provider);
			},
360 361 362 363
			registerCallHierarchyProvider(selector: vscode.DocumentSelector, provider: vscode.CallHierarchyItemProvider): vscode.Disposable {
				checkProposedApiEnabled(extension);
				return extHostLanguageFeatures.registerCallHierarchyProvider(extension, selector, provider);
			},
364
			setLanguageConfiguration: (language: string, configuration: vscode.LanguageConfiguration): vscode.Disposable => {
365
				return extHostLanguageFeatures.setLanguageConfiguration(language, configuration);
366
			}
367
		};
E
Erich Gamma 已提交
368

369 370 371 372 373 374 375 376
		// namespace: window
		const window: typeof vscode.window = {
			get activeTextEditor() {
				return extHostEditors.getActiveTextEditor();
			},
			get visibleTextEditors() {
				return extHostEditors.getVisibleTextEditors();
			},
377
			get activeTerminal() {
D
Daniel Imms 已提交
378
				return extHostTerminalService.activeTerminal;
379
			},
D
Daniel Imms 已提交
380
			get terminals() {
D
Daniel Imms 已提交
381
				return extHostTerminalService.terminals;
D
Daniel Imms 已提交
382
			},
383
			showTextDocument(documentOrUri: vscode.TextDocument | vscode.Uri, columnOrOptions?: vscode.ViewColumn | vscode.TextDocumentShowOptions, preserveFocus?: boolean): Thenable<vscode.TextEditor> {
384
				let documentPromise: Promise<vscode.TextDocument>;
J
Johannes Rieken 已提交
385
				if (URI.isUri(documentOrUri)) {
386
					documentPromise = Promise.resolve(workspace.openTextDocument(documentOrUri));
B
Benjamin Pasero 已提交
387
				} else {
388
					documentPromise = Promise.resolve(<vscode.TextDocument>documentOrUri);
B
Benjamin Pasero 已提交
389 390 391 392
				}
				return documentPromise.then(document => {
					return extHostEditors.showTextDocument(document, columnOrOptions, preserveFocus);
				});
393 394 395 396
			},
			createTextEditorDecorationType(options: vscode.DecorationRenderOptions): vscode.TextEditorDecorationType {
				return extHostEditors.createTextEditorDecorationType(options);
			},
397 398 399
			onDidChangeActiveTextEditor(listener, thisArg?, disposables?) {
				return extHostEditors.onDidChangeActiveTextEditor(listener, thisArg, disposables);
			},
400 401 402
			onDidChangeVisibleTextEditors(listener, thisArg, disposables) {
				return extHostEditors.onDidChangeVisibleTextEditors(listener, thisArg, disposables);
			},
403
			onDidChangeTextEditorSelection(listener: (e: vscode.TextEditorSelectionChangeEvent) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) {
404 405
				return extHostEditors.onDidChangeTextEditorSelection(listener, thisArgs, disposables);
			},
406
			onDidChangeTextEditorOptions(listener: (e: vscode.TextEditorOptionsChangeEvent) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) {
407 408
				return extHostEditors.onDidChangeTextEditorOptions(listener, thisArgs, disposables);
			},
409
			onDidChangeTextEditorVisibleRanges(listener: (e: vscode.TextEditorVisibleRangesChangeEvent) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) {
410
				return extHostEditors.onDidChangeTextEditorVisibleRanges(listener, thisArgs, disposables);
411
			},
412 413 414
			onDidChangeTextEditorViewColumn(listener, thisArg?, disposables?) {
				return extHostEditors.onDidChangeTextEditorViewColumn(listener, thisArg, disposables);
			},
415 416 417
			onDidCloseTerminal(listener, thisArg?, disposables?) {
				return extHostTerminalService.onDidCloseTerminal(listener, thisArg, disposables);
			},
D
Daniel Imms 已提交
418
			onDidOpenTerminal(listener, thisArg?, disposables?) {
419
				return extHostTerminalService.onDidOpenTerminal(listener, thisArg, disposables);
D
Daniel Imms 已提交
420
			},
D
Daniel Imms 已提交
421
			onDidChangeActiveTerminal(listener, thisArg?, disposables?) {
422
				return extHostTerminalService.onDidChangeActiveTerminal(listener, thisArg, disposables);
D
Daniel Imms 已提交
423
			},
424 425 426
			onDidChangeTerminalDimensions(listener, thisArg?, disposables?) {
				return extHostTerminalService.onDidChangeTerminalDimensions(listener, thisArg, disposables);
			},
J
Joao Moreno 已提交
427 428
			get state() {
				return extHostWindow.state;
429
			},
J
Joao Moreno 已提交
430
			onDidChangeWindowState(listener, thisArg?, disposables?) {
J
Joao Moreno 已提交
431
				return extHostWindow.onDidChangeWindowState(listener, thisArg, disposables);
J
Joao Moreno 已提交
432
			},
433
			showInformationMessage(message: string, first: vscode.MessageOptions | string | vscode.MessageItem, ...rest: Array<string | vscode.MessageItem>) {
434
				return extHostMessageService.showMessage(extension, Severity.Info, message, first, rest);
435
			},
436
			showWarningMessage(message: string, first: vscode.MessageOptions | string | vscode.MessageItem, ...rest: Array<string | vscode.MessageItem>) {
437
				return extHostMessageService.showMessage(extension, Severity.Warning, message, first, rest);
438
			},
439
			showErrorMessage(message: string, first: vscode.MessageOptions | string | vscode.MessageItem, ...rest: Array<string | vscode.MessageItem>) {
440
				return extHostMessageService.showMessage(extension, Severity.Error, message, first, rest);
441
			},
C
Christof Marti 已提交
442
			showQuickPick(items: any, options: vscode.QuickPickOptions, token?: vscode.CancellationToken): any {
443
				return extHostQuickOpen.showQuickPick(items, !!extension.enableProposedApi, options, token);
444
			},
445
			showWorkspaceFolderPick(options: vscode.WorkspaceFolderPickOptions) {
446
				return extHostQuickOpen.showWorkspaceFolderPick(options);
447
			},
448
			showInputBox(options?: vscode.InputBoxOptions, token?: vscode.CancellationToken) {
449
				return extHostQuickOpen.showInput(options, token);
C
Christof Marti 已提交
450
			},
451 452 453 454 455 456
			showOpenDialog(options) {
				return extHostDialogs.showOpenDialog(options);
			},
			showSaveDialog(options) {
				return extHostDialogs.showSaveDialog(options);
			},
457
			createStatusBarItem(position?: vscode.StatusBarAlignment, priority?: number): vscode.StatusBarItem {
458
				return extHostStatusBar.createStatusBarEntry(extension.identifier, <number>position, priority);
459 460 461 462
			},
			setStatusBarMessage(text: string, timeoutOrThenable?: number | Thenable<any>): vscode.Disposable {
				return extHostStatusBar.setStatusBarMessage(text, timeoutOrThenable);
			},
463
			withScmProgress<R>(task: (progress: vscode.Progress<number>) => Thenable<R>) {
464
				console.warn(`[Deprecation Warning] function 'withScmProgress' is deprecated and should no longer be used. Use 'withProgress' instead.`);
465
				return extHostProgress.withProgress(extension, { location: extHostTypes.ProgressLocation.SourceControl }, (progress, token) => task({ report(n: number) { /*noop*/ } }));
J
Johannes Rieken 已提交
466
			},
467
			withProgress<R>(options: vscode.ProgressOptions, task: (progress: vscode.Progress<{ message?: string; worked?: number }>, token: vscode.CancellationToken) => Thenable<R>) {
J
Johannes Rieken 已提交
468
				return extHostProgress.withProgress(extension, options, task);
469
			},
S
Sandeep Somavarapu 已提交
470 471
			createOutputChannel(name: string): vscode.OutputChannel {
				return extHostOutputService.createOutputChannel(name);
472
			},
473
			createWebviewPanel(viewType: string, title: string, showOptions: vscode.ViewColumn | { viewColumn: vscode.ViewColumn, preserveFocus?: boolean }, options: vscode.WebviewPanelOptions & vscode.WebviewOptions): vscode.WebviewPanel {
474
				return extHostWebviews.createWebviewPanel(extension, viewType, title, showOptions, options);
475
			},
476
			createTerminal(nameOrOptions?: vscode.TerminalOptions | string, shellPath?: string, shellArgs?: string[] | string): vscode.Terminal {
477 478 479
				if (typeof nameOrOptions === 'object') {
					return extHostTerminalService.createTerminalFromOptions(<vscode.TerminalOptions>nameOrOptions);
				}
D
Daniel Imms 已提交
480
				return extHostTerminalService.createTerminal(<string>nameOrOptions, shellPath, shellArgs);
481
			},
482
			createTerminalRenderer(name: string): vscode.TerminalRenderer {
483
				return extHostTerminalService.createTerminalRenderer(name);
484
			},
485
			registerTreeDataProvider(viewId: string, treeDataProvider: vscode.TreeDataProvider<any>): vscode.Disposable {
486
				return extHostTreeViews.registerTreeDataProvider(viewId, treeDataProvider, extension);
487
			},
488
			createTreeView(viewId: string, options: { treeDataProvider: vscode.TreeDataProvider<any> }): vscode.TreeView<any> {
489
				return extHostTreeViews.createTreeView(viewId, options, extension);
S
Sandeep Somavarapu 已提交
490
			},
491 492 493
			registerWebviewPanelSerializer: (viewType: string, serializer: vscode.WebviewPanelSerializer) => {
				return extHostWebviews.registerWebviewPanelSerializer(viewType, serializer);
			},
494
			registerDecorationProvider: proposedApiFunction(extension, (provider: vscode.DecorationProvider) => {
495
				return extHostDecorations.registerDecorationProvider(provider, extension.identifier);
M
Matt Bierner 已提交
496
			}),
J
Joao Moreno 已提交
497
			registerUriHandler(handler: vscode.UriHandler) {
498
				return extHostUrls.registerUriHandler(extension.identifier, handler);
J
Joao Moreno 已提交
499
			},
C
Christof Marti 已提交
500
			createQuickPick<T extends vscode.QuickPickItem>(): vscode.QuickPick<T> {
M
Matt Bierner 已提交
501
				return extHostQuickOpen.createQuickPick(extension.identifier, !!extension.enableProposedApi);
C
Christof Marti 已提交
502 503
			},
			createInputBox(): vscode.InputBox {
504
				return extHostQuickOpen.createInputBox(extension.identifier);
505
			}
506
		};
E
Erich Gamma 已提交
507

508 509 510
		// namespace: workspace
		const workspace: typeof vscode.workspace = {
			get rootPath() {
511
				return extHostWorkspace.getPath();
512 513 514 515
			},
			set rootPath(value) {
				throw errors.readonly();
			},
516
			getWorkspaceFolder(resource) {
517
				return extHostWorkspace.getWorkspaceFolder(resource);
518
			},
519
			get workspaceFolders() {
520
				return extHostWorkspace.getWorkspaceFolders();
521
			},
522
			get name() {
523
				return extHostWorkspace.name;
524 525 526 527
			},
			set name(value) {
				throw errors.readonly();
			},
528
			updateWorkspaceFolders: (index, deleteCount, ...workspaceFoldersToAdd) => {
529
				return extHostWorkspace.updateWorkspaceFolders(extension, index, deleteCount || 0, ...workspaceFoldersToAdd);
530
			},
531
			onDidChangeWorkspaceFolders: function (listener, thisArgs?, disposables?) {
532
				return extHostWorkspace.onDidChangeWorkspace(listener, thisArgs, disposables);
533
			},
534
			asRelativePath: (pathOrUri, includeWorkspace?) => {
535
				return extHostWorkspace.getRelativePath(pathOrUri, includeWorkspace);
536 537
			},
			findFiles: (include, exclude, maxResults?, token?) => {
538
				return extHostWorkspace.findFiles(typeConverters.GlobPattern.from(include), typeConverters.GlobPattern.from(withNullAsUndefined(exclude)), maxResults, extension.identifier, token);
539
			},
540
			findTextInFiles: (query: vscode.TextSearchQuery, optionsOrCallback: vscode.FindTextInFilesOptions | ((result: vscode.TextSearchResult) => void), callbackOrToken?: vscode.CancellationToken | ((result: vscode.TextSearchResult) => void), token?: vscode.CancellationToken) => {
541 542 543 544 545
				let options: vscode.FindTextInFilesOptions;
				let callback: (result: vscode.TextSearchResult) => void;

				if (typeof optionsOrCallback === 'object') {
					options = optionsOrCallback;
546
					callback = callbackOrToken as (result: vscode.TextSearchResult) => void;
547 548 549
				} else {
					options = {};
					callback = optionsOrCallback;
550
					token = callbackOrToken as vscode.CancellationToken;
551 552
				}

553
				return extHostWorkspace.findTextInFiles(query, options || {}, callback, extension.identifier, token);
R
Rob Lourens 已提交
554
			},
555
			saveAll: (includeUntitled?) => {
556
				return extHostWorkspace.saveAll(includeUntitled);
557
			},
558
			applyEdit(edit: vscode.WorkspaceEdit): Thenable<boolean> {
559
				return extHostEditors.applyWorkspaceEdit(edit);
560 561
			},
			createFileSystemWatcher: (pattern, ignoreCreate, ignoreChange, ignoreDelete): vscode.FileSystemWatcher => {
562
				return extHostFileSystemEvent.createFileSystemWatcher(typeConverters.GlobPattern.from(pattern), ignoreCreate, ignoreChange, ignoreDelete);
563 564 565 566 567 568 569
			},
			get textDocuments() {
				return extHostDocuments.getAllDocumentData().map(data => data.document);
			},
			set textDocuments(value) {
				throw errors.readonly();
			},
570
			openTextDocument(uriOrFileNameOrOptions?: vscode.Uri | string | { language?: string; content?: string; }) {
571
				let uriPromise: Thenable<URI>;
B
Benjamin Pasero 已提交
572

573
				const options = uriOrFileNameOrOptions as { language?: string; content?: string; };
B
Benjamin Pasero 已提交
574
				if (typeof uriOrFileNameOrOptions === 'string') {
575
					uriPromise = Promise.resolve(URI.file(uriOrFileNameOrOptions));
B
Benjamin Pasero 已提交
576
				} else if (uriOrFileNameOrOptions instanceof URI) {
577
					uriPromise = Promise.resolve(uriOrFileNameOrOptions);
B
Benjamin Pasero 已提交
578 579
				} else if (!options || typeof options === 'object') {
					uriPromise = extHostDocuments.createDocumentData(options);
580
				} else {
B
Benjamin Pasero 已提交
581
					throw new Error('illegal argument - uriOrFileNameOrOptions');
582
				}
B
Benjamin Pasero 已提交
583 584 585

				return uriPromise.then(uri => {
					return extHostDocuments.ensureDocumentData(uri).then(() => {
M
Matt Bierner 已提交
586
						return extHostDocuments.getDocument(uri);
B
Benjamin Pasero 已提交
587
					});
588 589 590 591 592 593 594 595 596 597 598 599 600 601 602
				});
			},
			onDidOpenTextDocument: (listener, thisArgs?, disposables?) => {
				return extHostDocuments.onDidAddDocument(listener, thisArgs, disposables);
			},
			onDidCloseTextDocument: (listener, thisArgs?, disposables?) => {
				return extHostDocuments.onDidRemoveDocument(listener, thisArgs, disposables);
			},
			onDidChangeTextDocument: (listener, thisArgs?, disposables?) => {
				return extHostDocuments.onDidChangeDocument(listener, thisArgs, disposables);
			},
			onDidSaveTextDocument: (listener, thisArgs?, disposables?) => {
				return extHostDocuments.onDidSaveDocument(listener, thisArgs, disposables);
			},
			onWillSaveTextDocument: (listener, thisArgs?, disposables?) => {
603
				return extHostDocumentSaveParticipant.getOnWillSaveTextDocumentEvent(extension)(listener, thisArgs, disposables);
604
			},
605
			onDidChangeConfiguration: (listener: (_: any) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) => {
606
				return configProvider.onDidChangeConfiguration(listener, thisArgs, disposables);
607
			},
608
			getConfiguration(section?: string, resource?: vscode.Uri): vscode.WorkspaceConfiguration {
R
Rob Lourens 已提交
609
				resource = arguments.length === 1 ? undefined : resource;
610
				return configProvider.getConfiguration(section, resource, extension.identifier);
611
			},
612 613
			registerTextDocumentContentProvider(scheme: string, provider: vscode.TextDocumentContentProvider) {
				return extHostDocumentContentProviders.registerTextDocumentContentProvider(scheme, provider);
614
			},
615
			registerTaskProvider: (type: string, provider: vscode.TaskProvider) => {
616
				return extHostTask.registerTaskProvider(extension, provider);
J
Johannes Rieken 已提交
617
			},
618
			registerFileSystemProvider(scheme, provider, options) {
619
				return extHostFileSystem.registerFileSystemProvider(scheme, provider, options);
620
			},
B
Benjamin Pasero 已提交
621
			registerFileSearchProvider: proposedApiFunction(extension, (scheme: string, provider: vscode.FileSearchProvider) => {
622
				return extHostSearch.registerFileSearchProvider(scheme, provider);
M
Matt Bierner 已提交
623
			}),
B
Benjamin Pasero 已提交
624
			registerTextSearchProvider: proposedApiFunction(extension, (scheme: string, provider: vscode.TextSearchProvider) => {
625 626
				return extHostSearch.registerTextSearchProvider(scheme, provider);
			}),
627
			registerDocumentCommentProvider: proposedApiFunction(extension, (provider: vscode.DocumentCommentProvider) => {
628
				return extHostComment.registerDocumentCommentProvider(extension.identifier, provider);
629 630
			}),
			registerWorkspaceCommentProvider: proposedApiFunction(extension, (provider: vscode.WorkspaceCommentProvider) => {
631
				return extHostComment.registerWorkspaceCommentProvider(extension.identifier, provider);
632
			}),
A
Alex Dima 已提交
633 634 635
			registerRemoteAuthorityResolver: proposedApiFunction(extension, (authorityPrefix: string, resolver: vscode.RemoteAuthorityResolver) => {
				return extensionService.registerRemoteAuthorityResolver(authorityPrefix, resolver);
			}),
636 637 638
			registerResourceLabelFormatter: proposedApiFunction(extension, (formatter: vscode.ResourceLabelFormatter) => {
				return extHostFileSystem.registerResourceLabelFormatter(formatter);
			}),
J
Johannes Rieken 已提交
639
			onDidRenameFile: proposedApiFunction(extension, (listener: (e: vscode.FileRenameEvent) => any, thisArg?: any, disposables?: vscode.Disposable[]) => {
640
				return extHostFileSystemEvent.onDidRenameFile(listener, thisArg, disposables);
641
			}),
J
Johannes Rieken 已提交
642
			onWillRenameFile: proposedApiFunction(extension, (listener: (e: vscode.FileWillRenameEvent) => any, thisArg?: any, disposables?: vscode.Disposable[]) => {
643
				return extHostFileSystemEvent.getOnWillRenameFileEvent(extension)(listener, thisArg, disposables);
J
Johannes Rieken 已提交
644
			})
645
		};
646

647 648
		// namespace: scm
		const scm: typeof vscode.scm = {
649
			get inputBox() {
650
				return extHostSCM.getLastInputBox(extension)!; // Strict null override - Deprecated api
651
			},
J
Joao Moreno 已提交
652 653
			createSourceControl(id: string, label: string, rootUri?: vscode.Uri) {
				return extHostSCM.createSourceControl(extension, id, label, rootUri);
J
Joao Moreno 已提交
654
			}
655
		};
J
Joao Moreno 已提交
656

657
		const comment: typeof vscode.comment = {
P
Peng Lyu 已提交
658 659
			createCommentController(id: string, label: string) {
				return extHostComment.createCommentController(extension, id, label);
660
			}
J
Joao Moreno 已提交
661
		};
662

663 664
		// namespace: debug
		const debug: typeof vscode.debug = {
665 666 667
			get activeDebugSession() {
				return extHostDebugService.activeDebugSession;
			},
668 669
			get activeDebugConsole() {
				return extHostDebugService.activeDebugConsole;
670
			},
671 672
			get breakpoints() {
				return extHostDebugService.breakpoints;
673
			},
674 675 676
			onDidStartDebugSession(listener, thisArg?, disposables?) {
				return extHostDebugService.onDidStartDebugSession(listener, thisArg, disposables);
			},
677
			onDidTerminateDebugSession(listener, thisArg?, disposables?) {
678
				return extHostDebugService.onDidTerminateDebugSession(listener, thisArg, disposables);
679
			},
A
Andre Weinand 已提交
680
			onDidChangeActiveDebugSession(listener, thisArg?, disposables?) {
681
				return extHostDebugService.onDidChangeActiveDebugSession(listener, thisArg, disposables);
A
Andre Weinand 已提交
682 683
			},
			onDidReceiveDebugSessionCustomEvent(listener, thisArg?, disposables?) {
A
Andre Weinand 已提交
684
				return extHostDebugService.onDidReceiveDebugSessionCustomEvent(listener, thisArg, disposables);
685
			},
686
			onDidChangeBreakpoints(listener, thisArgs?, disposables?) {
687 688
				return extHostDebugService.onDidChangeBreakpoints(listener, thisArgs, disposables);
			},
A
Andre Weinand 已提交
689
			registerDebugConfigurationProvider(debugType: string, provider: vscode.DebugConfigurationProvider) {
690
				return extHostDebugService.registerDebugConfigurationProvider(debugType, provider);
691
			},
A
Andre Weinand 已提交
692 693
			registerDebugAdapterDescriptorFactory(debugType: string, factory: vscode.DebugAdapterDescriptorFactory) {
				return extHostDebugService.registerDebugAdapterDescriptorFactory(extension, debugType, factory);
694
			},
A
Andre Weinand 已提交
695 696
			registerDebugAdapterTrackerFactory(debugType: string, factory: vscode.DebugAdapterTrackerFactory) {
				return extHostDebugService.registerDebugAdapterTrackerFactory(debugType, factory);
697
			},
698 699
			startDebugging(folder: vscode.WorkspaceFolder | undefined, nameOrConfig: string | vscode.DebugConfiguration, parentSession?: vscode.DebugSession) {
				return extHostDebugService.startDebugging(folder, nameOrConfig, parentSession);
700 701
			},
			addBreakpoints(breakpoints: vscode.Breakpoint[]) {
702
				return extHostDebugService.addBreakpoints(breakpoints);
703 704
			},
			removeBreakpoints(breakpoints: vscode.Breakpoint[]) {
705
				return extHostDebugService.removeBreakpoints(breakpoints);
706
			}
707 708
		};

D
Dirk Baeumer 已提交
709 710 711 712
		const tasks: typeof vscode.tasks = {
			registerTaskProvider: (type: string, provider: vscode.TaskProvider) => {
				return extHostTask.registerTaskProvider(extension, provider);
			},
713
			fetchTasks: (filter?: vscode.TaskFilter): Thenable<vscode.Task[]> => {
D
Dirk Baeumer 已提交
714
				return extHostTask.fetchTasks(filter);
715 716
			},
			executeTask: (task: vscode.Task): Thenable<vscode.TaskExecution> => {
D
Dirk Baeumer 已提交
717
				return extHostTask.executeTask(extension, task);
718
			},
D
Dirk Baeumer 已提交
719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734
			get taskExecutions(): vscode.TaskExecution[] {
				return extHostTask.taskExecutions;
			},
			onDidStartTask: (listeners, thisArgs?, disposables?) => {
				return extHostTask.onDidStartTask(listeners, thisArgs, disposables);
			},
			onDidEndTask: (listeners, thisArgs?, disposables?) => {
				return extHostTask.onDidEndTask(listeners, thisArgs, disposables);
			},
			onDidStartTaskProcess: (listeners, thisArgs?, disposables?) => {
				return extHostTask.onDidStartTaskProcess(listeners, thisArgs, disposables);
			},
			onDidEndTaskProcess: (listeners, thisArgs?, disposables?) => {
				return extHostTask.onDidEndTaskProcess(listeners, thisArgs, disposables);
			}
		};
735

736
		return <typeof vscode>{
737
			version: initData.version,
738 739
			// namespaces
			commands,
740
			debug,
741 742 743
			env,
			extensions,
			languages,
J
Joao Moreno 已提交
744
			scm,
745
			comment,
D
Dirk Baeumer 已提交
746
			tasks,
747 748
			window,
			workspace,
749
			// types
750
			Breakpoint: extHostTypes.Breakpoint,
751
			CancellationTokenSource: CancellationTokenSource,
752
			CodeAction: extHostTypes.CodeAction,
M
Matt Bierner 已提交
753
			CodeActionKind: extHostTypes.CodeActionKind,
754
			CodeActionTrigger: extHostTypes.CodeActionTrigger,
755
			CodeLens: extHostTypes.CodeLens,
R
Rob DeLine 已提交
756
			CodeInset: extHostTypes.CodeInset,
757
			Color: extHostTypes.Color,
758
			ColorInformation: extHostTypes.ColorInformation,
759 760
			ColorPresentation: extHostTypes.ColorPresentation,
			CommentThreadCollapsibleState: extHostTypes.CommentThreadCollapsibleState,
761 762 763
			CompletionItem: extHostTypes.CompletionItem,
			CompletionItemKind: extHostTypes.CompletionItemKind,
			CompletionList: extHostTypes.CompletionList,
M
Matt Bierner 已提交
764
			CompletionTriggerKind: extHostTypes.CompletionTriggerKind,
765
			ConfigurationTarget: extHostTypes.ConfigurationTarget,
766
			DebugAdapterExecutable: extHostTypes.DebugAdapterExecutable,
767
			DebugAdapterServer: extHostTypes.DebugAdapterServer,
768
			DecorationRangeBehavior: extHostTypes.DecorationRangeBehavior,
769
			Diagnostic: extHostTypes.Diagnostic,
770
			DiagnosticRelatedInformation: extHostTypes.DiagnosticRelatedInformation,
771
			DiagnosticSeverity: extHostTypes.DiagnosticSeverity,
772
			DiagnosticTag: extHostTypes.DiagnosticTag,
773 774 775
			Disposable: extHostTypes.Disposable,
			DocumentHighlight: extHostTypes.DocumentHighlight,
			DocumentHighlightKind: extHostTypes.DocumentHighlightKind,
776
			DocumentLink: extHostTypes.DocumentLink,
777 778
			DocumentSymbol: extHostTypes.DocumentSymbol,
			EndOfLine: extHostTypes.EndOfLine,
779
			EventEmitter: Emitter,
G
Gabriel DeBacker 已提交
780
			CustomExecution: extHostTypes.CustomExecution,
781 782 783 784 785
			FileChangeType: extHostTypes.FileChangeType,
			FileSystemError: extHostTypes.FileSystemError,
			FileType: files.FileType,
			FoldingRange: extHostTypes.FoldingRange,
			FoldingRangeKind: extHostTypes.FoldingRangeKind,
786
			FunctionBreakpoint: extHostTypes.FunctionBreakpoint,
787
			Hover: extHostTypes.Hover,
788
			IndentAction: languageConfiguration.IndentAction,
789
			Location: extHostTypes.Location,
790
			LogLevel: extHostTypes.LogLevel,
791
			MarkdownString: extHostTypes.MarkdownString,
792
			OverviewRulerLane: OverviewRulerLane,
793 794
			ParameterInformation: extHostTypes.ParameterInformation,
			Position: extHostTypes.Position,
795 796
			ProcessExecution: extHostTypes.ProcessExecution,
			ProgressLocation: extHostTypes.ProgressLocation,
797
			QuickInputButtons: extHostTypes.QuickInputButtons,
798
			Range: extHostTypes.Range,
799
			RelativePattern: extHostTypes.RelativePattern,
A
Alex Dima 已提交
800
			ResolvedAuthority: extHostTypes.ResolvedAuthority,
801
			Selection: extHostTypes.Selection,
802
			SelectionRange: extHostTypes.SelectionRange,
803 804
			ShellExecution: extHostTypes.ShellExecution,
			ShellQuoting: extHostTypes.ShellQuoting,
M
Matt Bierner 已提交
805
			SignatureHelpTriggerKind: extHostTypes.SignatureHelpTriggerKind,
806 807 808
			SignatureHelp: extHostTypes.SignatureHelp,
			SignatureInformation: extHostTypes.SignatureInformation,
			SnippetString: extHostTypes.SnippetString,
809
			SourceBreakpoint: extHostTypes.SourceBreakpoint,
810
			SourceControlInputBoxValidationType: extHostTypes.SourceControlInputBoxValidationType,
811 812 813
			StatusBarAlignment: extHostTypes.StatusBarAlignment,
			SymbolInformation: extHostTypes.SymbolInformation,
			SymbolKind: extHostTypes.SymbolKind,
814
			Task: extHostTypes.Task,
A
Alex Ross 已提交
815
			Task2: extHostTypes.Task,
816 817 818 819
			TaskGroup: extHostTypes.TaskGroup,
			TaskPanelKind: extHostTypes.TaskPanelKind,
			TaskRevealKind: extHostTypes.TaskRevealKind,
			TaskScope: extHostTypes.TaskScope,
820 821
			TextDocumentSaveReason: extHostTypes.TextDocumentSaveReason,
			TextEdit: extHostTypes.TextEdit,
822
			TextEditorCursorStyle: TextEditorCursorStyle,
823
			TextEditorLineNumbersStyle: extHostTypes.TextEditorLineNumbersStyle,
824
			TextEditorRevealType: extHostTypes.TextEditorRevealType,
825
			TextEditorSelectionChangeKind: extHostTypes.TextEditorSelectionChangeKind,
826 827 828
			ThemeColor: extHostTypes.ThemeColor,
			ThemeIcon: extHostTypes.ThemeIcon,
			TreeItem: extHostTypes.TreeItem,
829
			TreeItem2: extHostTypes.TreeItem,
830
			TreeItemCollapsibleState: extHostTypes.TreeItemCollapsibleState,
831
			Uri: URI,
832 833
			ViewColumn: extHostTypes.ViewColumn,
			WorkspaceEdit: extHostTypes.WorkspaceEdit,
834 835 836
			// proposed
			CallHierarchyDirection: extHostTypes.CallHierarchyDirection,
			CallHierarchyItem: extHostTypes.CallHierarchyItem
837
		};
838
	};
E
Erich Gamma 已提交
839 840 841 842
}

class Extension<T> implements vscode.Extension<T> {

A
Alex Dima 已提交
843
	private _extensionService: ExtHostExtensionService;
844
	private _identifier: ExtensionIdentifier;
E
Erich Gamma 已提交
845 846 847

	public id: string;
	public extensionPath: string;
848
	public packageJSON: IExtensionDescription;
E
Erich Gamma 已提交
849

J
Johannes Rieken 已提交
850
	constructor(extensionService: ExtHostExtensionService, description: IExtensionDescription) {
A
Alex Dima 已提交
851
		this._extensionService = extensionService;
852 853
		this._identifier = description.identifier;
		this.id = description.identifier.value;
854
		this.extensionPath = path.normalize(originalFSPath(description.extensionLocation));
E
Erich Gamma 已提交
855 856 857 858
		this.packageJSON = description;
	}

	get isActive(): boolean {
859
		return this._extensionService.isActivated(this._identifier);
E
Erich Gamma 已提交
860 861 862
	}

	get exports(): T {
863
		if (this.packageJSON.api === 'none') {
864
			return undefined!; // Strict nulloverride - Public api
865
		}
866
		return <T>this._extensionService.getExtensionExports(this._identifier);
E
Erich Gamma 已提交
867 868 869
	}

	activate(): Thenable<T> {
870
		return this._extensionService.activateByIdWithErrors(this._identifier, new ExtensionActivatedByAPI(false)).then(() => this.exports);
E
Erich Gamma 已提交
871 872 873
	}
}

A
Alex Dima 已提交
874 875 876 877 878
interface INodeModuleFactory {
	readonly nodeModuleName: string;
	load(request: string, parent: { filename: string; }): any;
}

879
export class NodeModuleRequireInterceptor {
A
Alex Dima 已提交
880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904
	public static INSTANCE = new NodeModuleRequireInterceptor();

	private readonly _factories: Map<string, INodeModuleFactory>;

	constructor() {
		this._factories = new Map<string, INodeModuleFactory>();
		this._installInterceptor(this._factories);
	}

	private _installInterceptor(factories: Map<string, INodeModuleFactory>): void {
		const node_module = <any>require.__$__nodeRequire('module');
		const original = node_module._load;
		node_module._load = function load(request: string, parent: { filename: string; }, isMain: any) {
			if (!factories.has(request)) {
				return original.apply(this, arguments);
			}
			return factories.get(request)!.load(request, parent);
		};
	}

	public register(interceptor: INodeModuleFactory): void {
		this._factories.set(interceptor.nodeModuleName, interceptor);
	}
}

905
export class VSCodeNodeModuleFactory implements INodeModuleFactory {
A
Alex Dima 已提交
906
	public readonly nodeModuleName = 'vscode';
J
Johannes Rieken 已提交
907

A
Alex Dima 已提交
908 909
	private readonly _extApiImpl = new Map<string, typeof vscode>();
	private _defaultApiImpl: typeof vscode;
910

A
Alex Dima 已提交
911 912 913 914 915 916 917 918 919
	constructor(
		private readonly _apiFactory: IExtensionApiFactory,
		private readonly _extensionPaths: TernarySearchTree<IExtensionDescription>,
		private readonly _extensionRegistry: ExtensionDescriptionRegistry,
		private readonly _configProvider: ExtHostConfigProvider
	) {
	}

	public load(request: string, parent: { filename: string; }): any {
920 921

		// get extension id from filename and api for extension
A
Alex Dima 已提交
922
		const ext = this._extensionPaths.findSubstr(URI.file(parent.filename).fsPath);
923
		if (ext) {
A
Alex Dima 已提交
924
			let apiImpl = this._extApiImpl.get(ExtensionIdentifier.toKey(ext.identifier));
925
			if (!apiImpl) {
A
Alex Dima 已提交
926 927
				apiImpl = this._apiFactory(ext, this._extensionRegistry, this._configProvider);
				this._extApiImpl.set(ExtensionIdentifier.toKey(ext.identifier), apiImpl);
928 929 930 931 932
			}
			return apiImpl;
		}

		// fall back to a default implementation
A
Alex Dima 已提交
933
		if (!this._defaultApiImpl) {
934
			let extensionPathsPretty = '';
A
Alex Dima 已提交
935
			this._extensionPaths.forEach((value, index) => extensionPathsPretty += `\t${index} -> ${value.identifier.value}\n`);
936
			console.warn(`Could not identify extension for 'vscode' require call from ${parent.filename}. These are the extension path mappings: \n${extensionPathsPretty}`);
A
Alex Dima 已提交
937
			this._defaultApiImpl = this._apiFactory(nullExtensionDescription, this._extensionRegistry, this._configProvider);
E
Erich Gamma 已提交
938
		}
A
Alex Dima 已提交
939 940
		return this._defaultApiImpl;
	}
E
Erich Gamma 已提交
941
}
A
Alex Dima 已提交
942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975

interface IKeytarModule {
	getPassword(service: string, account: string): Promise<string | null>;
	setPassword(service: string, account: string, password: string): Promise<void>;
	deletePassword(service: string, account: string): Promise<boolean>;
	findPassword(service: string): Promise<string | null>;
}

export class KeytarNodeModuleFactory implements INodeModuleFactory {
	public readonly nodeModuleName = 'keytar';

	private _impl: IKeytarModule;

	constructor(mainThreadKeytar: MainThreadKeytarShape) {
		this._impl = {
			getPassword: (service: string, account: string): Promise<string | null> => {
				return mainThreadKeytar.$getPassword(service, account);
			},
			setPassword: (service: string, account: string, password: string): Promise<void> => {
				return mainThreadKeytar.$setPassword(service, account, password);
			},
			deletePassword: (service: string, account: string): Promise<boolean> => {
				return mainThreadKeytar.$deletePassword(service, account);
			},
			findPassword: (service: string): Promise<string | null> => {
				return mainThreadKeytar.$findPassword(service);
			}
		};
	}

	public load(request: string, parent: { filename: string; }): any {
		return this._impl;
	}
}