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

7
import { Emitter } from 'vs/base/common/event';
8
import { TernarySearchTree } from 'vs/base/common/map';
J
Johannes Rieken 已提交
9
import { score } from 'vs/editor/common/modes/languageSelector';
A
Alex Dima 已提交
10
import * as platform from 'vs/base/common/platform';
E
Erich Gamma 已提交
11
import * as errors from 'vs/base/common/errors';
12 13
import product from 'vs/platform/node/product';
import pkg from 'vs/platform/node/package';
J
Johannes Rieken 已提交
14
import { ExtHostFileSystemEventService } from 'vs/workbench/api/node/extHostFileSystemEventService';
J
Johannes Rieken 已提交
15
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors';
J
Johannes Rieken 已提交
16
import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments';
17
import { ExtHostDocumentContentProvider } from 'vs/workbench/api/node/extHostDocumentContentProviders';
J
Johannes Rieken 已提交
18 19 20
import { ExtHostDocumentSaveParticipant } from 'vs/workbench/api/node/extHostDocumentSaveParticipant';
import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration';
import { ExtHostDiagnostics } from 'vs/workbench/api/node/extHostDiagnostics';
S
Sandeep Somavarapu 已提交
21
import { ExtHostTreeViews } from 'vs/workbench/api/node/extHostTreeViews';
J
Johannes Rieken 已提交
22 23
import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace';
import { ExtHostQuickOpen } from 'vs/workbench/api/node/extHostQuickOpen';
24
import { ExtHostProgress } from 'vs/workbench/api/node/extHostProgress';
J
Joao Moreno 已提交
25
import { ExtHostSCM } from 'vs/workbench/api/node/extHostSCM';
J
Johannes Rieken 已提交
26 27 28 29 30 31
import { ExtHostHeapService } from 'vs/workbench/api/node/extHostHeapService';
import { ExtHostStatusBar } from 'vs/workbench/api/node/extHostStatusBar';
import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands';
import { ExtHostOutputService } from 'vs/workbench/api/node/extHostOutputService';
import { ExtHostTerminalService } from 'vs/workbench/api/node/extHostTerminalService';
import { ExtHostMessageService } from 'vs/workbench/api/node/extHostMessageService';
J
Johannes Rieken 已提交
32
import { ExtHostEditors } from 'vs/workbench/api/node/extHostTextEditors';
J
Johannes Rieken 已提交
33
import { ExtHostLanguages } from 'vs/workbench/api/node/extHostLanguages';
A
Alex Dima 已提交
34
import { ExtHostLanguageFeatures, ISchemeTransformer } from 'vs/workbench/api/node/extHostLanguageFeatures';
35
import { ExtHostApiCommands } from 'vs/workbench/api/node/extHostApiCommands';
36
import { ExtHostTask } from 'vs/workbench/api/node/extHostTask';
37
import { ExtHostDebugService } from 'vs/workbench/api/node/extHostDebugService';
38
import { ExtHostWindow } from 'vs/workbench/api/node/extHostWindow';
J
Johannes Rieken 已提交
39
import * as extHostTypes from 'vs/workbench/api/node/extHostTypes';
E
Erich Gamma 已提交
40 41
import URI from 'vs/base/common/uri';
import Severity from 'vs/base/common/severity';
42
import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions';
J
Johannes Rieken 已提交
43 44 45
import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService';
import { TPromise } from 'vs/base/common/winjs.base';
import { CancellationTokenSource } from 'vs/base/common/cancellation';
46
import * as vscode from 'vscode';
E
Erich Gamma 已提交
47
import * as paths from 'vs/base/common/paths';
48
import * as files from 'vs/platform/files/common/files';
49
import { MainContext, ExtHostContext, IInitData, IExtHostContext } from './extHost.protocol';
50
import * as languageConfiguration from 'vs/editor/common/modes/languageConfiguration';
51
import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions';
A
Alex Dima 已提交
52
import { ProxyIdentifier } from 'vs/workbench/services/extensions/node/proxyIdentifier';
B
Benjamin Pasero 已提交
53
import { ExtHostDialogs } from 'vs/workbench/api/node/extHostDialogs';
54
import { ExtHostFileSystem } from 'vs/workbench/api/node/extHostFileSystem';
55
import { ExtHostDecorations } from 'vs/workbench/api/node/extHostDecorations';
56
import * as typeConverters from 'vs/workbench/api/node/extHostTypeConverters';
A
Alex Dima 已提交
57
import { ExtensionActivatedByAPI } from 'vs/workbench/api/node/extHostExtensionActivator';
A
Alex Dima 已提交
58
import { OverviewRulerLane } from 'vs/editor/common/model';
59
import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService';
M
Matt Bierner 已提交
60
import { ExtHostWebviews } from 'vs/workbench/api/node/extHostWebview';
61
import { ExtHostSearch } from './extHostSearch';
J
Joao Moreno 已提交
62
import { ExtHostUrls } from './extHostUrls';
E
Erich Gamma 已提交
63

64
export interface IExtensionApiFactory {
65
	(extension: IExtensionDescription): typeof vscode;
66 67
}

68 69 70 71 72 73 74 75 76 77
export function checkProposedApiEnabled(extension: IExtensionDescription): void {
	if (!extension.enableProposedApi) {
		throwProposedApiError(extension);
	}
}

function throwProposedApiError(extension: IExtensionDescription): never {
	throw new Error(`[${extension.id}]: Proposed API is only available when running out of dev or with the following command line switch: --enable-proposed-api ${extension.id}`);
}

78
function proposedApiFunction<T>(extension: IExtensionDescription, fn: T): T {
79
	if (extension.enableProposedApi) {
80 81
		return fn;
	} else {
82
		return <any>throwProposedApiError;
83 84 85
	}
}

E
Erich Gamma 已提交
86
/**
87
 * This method instantiates and returns the extension API surface
E
Erich Gamma 已提交
88
 */
89 90
export function createApiFactory(
	initData: IInitData,
A
Alex Dima 已提交
91
	rpcProtocol: IExtHostContext,
92 93
	extHostWorkspace: ExtHostWorkspace,
	extHostConfiguration: ExtHostConfiguration,
J
Joao Moreno 已提交
94
	extensionService: ExtHostExtensionService,
95
	extHostLogService: ExtHostLogService
96
): IExtensionApiFactory {
97

A
Alex Dima 已提交
98 99
	let schemeTransformer: ISchemeTransformer = null;

100
	// Addressable instances
101
	rpcProtocol.set(ExtHostContext.ExtHostLogService, extHostLogService);
A
Alex Dima 已提交
102 103
	const extHostHeapService = rpcProtocol.set(ExtHostContext.ExtHostHeapService, new ExtHostHeapService());
	const extHostDecorations = rpcProtocol.set(ExtHostContext.ExtHostDecorations, new ExtHostDecorations(rpcProtocol));
M
Matt Bierner 已提交
104
	const extHostWebviews = rpcProtocol.set(ExtHostContext.ExtHostWebviews, new ExtHostWebviews(rpcProtocol));
J
Joao Moreno 已提交
105
	const extHostUrls = rpcProtocol.set(ExtHostContext.ExtHostUrls, new ExtHostUrls(rpcProtocol));
106
	const extHostDocumentsAndEditors = rpcProtocol.set(ExtHostContext.ExtHostDocumentsAndEditors, new ExtHostDocumentsAndEditors(rpcProtocol));
A
Alex Dima 已提交
107
	const extHostDocuments = rpcProtocol.set(ExtHostContext.ExtHostDocuments, new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors));
108
	const extHostDocumentContentProviders = rpcProtocol.set(ExtHostContext.ExtHostDocumentContentProviders, new ExtHostDocumentContentProvider(rpcProtocol, extHostDocumentsAndEditors, extHostLogService));
109
	const extHostDocumentSaveParticipant = rpcProtocol.set(ExtHostContext.ExtHostDocumentSaveParticipant, new ExtHostDocumentSaveParticipant(extHostLogService, extHostDocuments, rpcProtocol.getProxy(MainContext.MainThreadTextEditors)));
A
Alex Dima 已提交
110
	const extHostEditors = rpcProtocol.set(ExtHostContext.ExtHostEditors, new ExtHostEditors(rpcProtocol, extHostDocumentsAndEditors));
111
	const extHostCommands = rpcProtocol.set(ExtHostContext.ExtHostCommands, new ExtHostCommands(rpcProtocol, extHostHeapService, extHostLogService));
A
Alex Dima 已提交
112 113
	const extHostTreeViews = rpcProtocol.set(ExtHostContext.ExtHostTreeViews, new ExtHostTreeViews(rpcProtocol.getProxy(MainContext.MainThreadTreeViews), extHostCommands));
	rpcProtocol.set(ExtHostContext.ExtHostWorkspace, extHostWorkspace);
A
Andre Weinand 已提交
114
	const extHostDebugService = rpcProtocol.set(ExtHostContext.ExtHostDebugService, new ExtHostDebugService(rpcProtocol, extHostWorkspace, extensionService, extHostDocumentsAndEditors, extHostConfiguration));
A
Alex Dima 已提交
115 116
	rpcProtocol.set(ExtHostContext.ExtHostConfiguration, extHostConfiguration);
	const extHostDiagnostics = rpcProtocol.set(ExtHostContext.ExtHostDiagnostics, new ExtHostDiagnostics(rpcProtocol));
A
Alex Dima 已提交
117
	const extHostLanguageFeatures = rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, new ExtHostLanguageFeatures(rpcProtocol, schemeTransformer, extHostDocuments, extHostCommands, extHostHeapService, extHostDiagnostics));
118
	const extHostFileSystem = rpcProtocol.set(ExtHostContext.ExtHostFileSystem, new ExtHostFileSystem(rpcProtocol, extHostLanguageFeatures));
A
Alex Dima 已提交
119 120
	const extHostFileSystemEvent = rpcProtocol.set(ExtHostContext.ExtHostFileSystemEventService, new ExtHostFileSystemEventService());
	const extHostQuickOpen = rpcProtocol.set(ExtHostContext.ExtHostQuickOpen, new ExtHostQuickOpen(rpcProtocol, extHostWorkspace, extHostCommands));
121
	const extHostTerminalService = rpcProtocol.set(ExtHostContext.ExtHostTerminalService, new ExtHostTerminalService(rpcProtocol, extHostConfiguration, extHostLogService));
122
	const extHostSCM = rpcProtocol.set(ExtHostContext.ExtHostSCM, new ExtHostSCM(rpcProtocol, extHostCommands, extHostLogService));
A
Alex Dima 已提交
123
	const extHostSearch = rpcProtocol.set(ExtHostContext.ExtHostSearch, new ExtHostSearch(rpcProtocol, schemeTransformer));
124
	const extHostTask = rpcProtocol.set(ExtHostContext.ExtHostTask, new ExtHostTask(rpcProtocol, extHostWorkspace, extHostDocumentsAndEditors, extHostConfiguration));
A
Alex Dima 已提交
125 126
	const extHostWindow = rpcProtocol.set(ExtHostContext.ExtHostWindow, new ExtHostWindow(rpcProtocol));
	rpcProtocol.set(ExtHostContext.ExtHostExtensionService, extensionService);
127
	const extHostProgress = rpcProtocol.set(ExtHostContext.ExtHostProgress, new ExtHostProgress(rpcProtocol.getProxy(MainContext.MainThreadProgress)));
128 129

	// Check that no named customers are missing
A
Alex Dima 已提交
130
	const expected: ProxyIdentifier<any>[] = Object.keys(ExtHostContext).map((key) => (<any>ExtHostContext)[key]);
A
Alex Dima 已提交
131
	rpcProtocol.assertRegistered(expected);
132

133
	// Other instances
A
Alex Dima 已提交
134 135 136 137 138
	const extHostMessageService = new ExtHostMessageService(rpcProtocol);
	const extHostDialogs = new ExtHostDialogs(rpcProtocol);
	const extHostStatusBar = new ExtHostStatusBar(rpcProtocol);
	const extHostOutputService = new ExtHostOutputService(rpcProtocol);
	const extHostLanguages = new ExtHostLanguages(rpcProtocol);
139

140
	// Register API-ish commands
141
	ExtHostApiCommands.register(extHostCommands);
142

143
	return function (extension: IExtensionDescription): typeof vscode {
144

145 146 147 148 149 150
		// 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...
		let checkSelector = (function () {
A
Alex Dima 已提交
151
			let done = (!extension.isUnderDevelopment);
152 153 154 155 156
			function informOnce(selector: vscode.DocumentSelector) {
				if (!done) {
					console.info(`Extension '${extension.id}' uses a document selector without scheme. Learn more about this: https://go.microsoft.com/fwlink/?linkid=872305`);
					done = true;
				}
157 158
			}
			return function perform(selector: vscode.DocumentSelector): vscode.DocumentSelector {
159 160 161 162 163 164 165 166 167 168
				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);
169 170 171 172 173 174
					}
				}
				return selector;
			};
		})();

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

					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) => {
197
						console.warn('An error occurred while running command ' + id, err);
198
					});
199
				});
200 201
			},
			registerDiffInformationCommand: proposedApiFunction(extension, (id: string, callback: (diff: vscode.LineChange[], ...args: any[]) => any, thisArg?: any): vscode.Disposable => {
202
				return extHostCommands.registerCommand(true, id, async (...args: any[]) => {
203 204 205 206 207 208 209 210 211
					let activeTextEditor = extHostEditors.getActiveTextEditor();
					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]);
				});
212
			}),
213
			executeCommand<T>(id: string, ...args: any[]): Thenable<T> {
214
				return extHostCommands.executeCommand<T>(id, ...args);
215
			},
216 217 218
			getCommands(filterInternal: boolean = false): Thenable<string[]> {
				return extHostCommands.getCommands(filterInternal);
			}
219
		};
220

221 222
		// namespace: env
		const env: typeof vscode.env = Object.freeze({
223 224
			get machineId() { return initData.telemetryInfo.machineId; },
			get sessionId() { return initData.telemetryInfo.sessionId; },
A
Alex Dima 已提交
225
			get language() { return platform.language; },
J
Johannes Rieken 已提交
226 227
			get appName() { return product.nameLong; },
			get appRoot() { return initData.environment.appRoot; },
M
Matt Bierner 已提交
228
			get logLevel() { return extHostLogService.getLevel(); }
229
		});
E
Erich Gamma 已提交
230

231 232 233
		// namespace: extensions
		const extensions: typeof vscode.extensions = {
			getExtension(extensionId: string): Extension<any> {
234
				let desc = extensionService.getExtensionDescription(extensionId);
235 236 237
				if (desc) {
					return new Extension(extensionService, desc);
				}
238
				return undefined;
239 240
			},
			get all(): Extension<any>[] {
241
				return extensionService.getAllExtensionDescriptions().map((desc) => new Extension(extensionService, desc));
E
Erich Gamma 已提交
242
			}
243
		};
E
Erich Gamma 已提交
244

245 246 247 248 249
		// namespace: languages
		const languages: typeof vscode.languages = {
			createDiagnosticCollection(name?: string): vscode.DiagnosticCollection {
				return extHostDiagnostics.createDiagnosticCollection(name);
			},
250 251 252
			get onDidChangeDiagnostics() {
				return extHostDiagnostics.onDidChangeDiagnostics;
			},
A
Alex Dima 已提交
253
			getDiagnostics: (resource?: vscode.Uri) => {
254 255
				return <any>extHostDiagnostics.getDiagnostics(resource);
			},
256 257 258 259
			getLanguages(): TPromise<string[]> {
				return extHostLanguages.getLanguages();
			},
			match(selector: vscode.DocumentSelector, document: vscode.TextDocument): number {
260
				return score(typeConverters.LanguageSelector.from(selector), document.uri, document.languageId, true);
261
			},
262 263
			registerCodeActionsProvider(selector: vscode.DocumentSelector, provider: vscode.CodeActionProvider, metadata?: vscode.CodeActionProviderMetadata): vscode.Disposable {
				return extHostLanguageFeatures.registerCodeActionProvider(checkSelector(selector), provider, metadata);
264 265
			},
			registerCodeLensProvider(selector: vscode.DocumentSelector, provider: vscode.CodeLensProvider): vscode.Disposable {
266
				return extHostLanguageFeatures.registerCodeLensProvider(checkSelector(selector), provider);
267 268
			},
			registerDefinitionProvider(selector: vscode.DocumentSelector, provider: vscode.DefinitionProvider): vscode.Disposable {
269
				return extHostLanguageFeatures.registerDefinitionProvider(checkSelector(selector), provider);
270
			},
M
Matt Bierner 已提交
271
			registerImplementationProvider(selector: vscode.DocumentSelector, provider: vscode.ImplementationProvider): vscode.Disposable {
272
				return extHostLanguageFeatures.registerImplementationProvider(checkSelector(selector), provider);
273
			},
274
			registerTypeDefinitionProvider(selector: vscode.DocumentSelector, provider: vscode.TypeDefinitionProvider): vscode.Disposable {
275
				return extHostLanguageFeatures.registerTypeDefinitionProvider(checkSelector(selector), provider);
276
			},
277
			registerHoverProvider(selector: vscode.DocumentSelector, provider: vscode.HoverProvider): vscode.Disposable {
278
				return extHostLanguageFeatures.registerHoverProvider(checkSelector(selector), provider, extension.id);
279 280
			},
			registerDocumentHighlightProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentHighlightProvider): vscode.Disposable {
281
				return extHostLanguageFeatures.registerDocumentHighlightProvider(checkSelector(selector), provider);
282 283
			},
			registerReferenceProvider(selector: vscode.DocumentSelector, provider: vscode.ReferenceProvider): vscode.Disposable {
284
				return extHostLanguageFeatures.registerReferenceProvider(checkSelector(selector), provider);
285 286
			},
			registerRenameProvider(selector: vscode.DocumentSelector, provider: vscode.RenameProvider): vscode.Disposable {
287
				return extHostLanguageFeatures.registerRenameProvider(checkSelector(selector), provider);
288 289
			},
			registerDocumentSymbolProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentSymbolProvider): vscode.Disposable {
290
				return extHostLanguageFeatures.registerDocumentSymbolProvider(checkSelector(selector), provider, extension.id);
291 292
			},
			registerWorkspaceSymbolProvider(provider: vscode.WorkspaceSymbolProvider): vscode.Disposable {
293
				return extHostLanguageFeatures.registerWorkspaceSymbolProvider(provider);
294 295
			},
			registerDocumentFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentFormattingEditProvider): vscode.Disposable {
296
				return extHostLanguageFeatures.registerDocumentFormattingEditProvider(checkSelector(selector), provider);
297 298
			},
			registerDocumentRangeFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentRangeFormattingEditProvider): vscode.Disposable {
299
				return extHostLanguageFeatures.registerDocumentRangeFormattingEditProvider(checkSelector(selector), provider);
300 301
			},
			registerOnTypeFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.OnTypeFormattingEditProvider, firstTriggerCharacter: string, ...moreTriggerCharacters: string[]): vscode.Disposable {
302
				return extHostLanguageFeatures.registerOnTypeFormattingEditProvider(checkSelector(selector), provider, [firstTriggerCharacter].concat(moreTriggerCharacters));
303 304
			},
			registerSignatureHelpProvider(selector: vscode.DocumentSelector, provider: vscode.SignatureHelpProvider, ...triggerCharacters: string[]): vscode.Disposable {
305
				return extHostLanguageFeatures.registerSignatureHelpProvider(checkSelector(selector), provider, triggerCharacters);
306 307
			},
			registerCompletionItemProvider(selector: vscode.DocumentSelector, provider: vscode.CompletionItemProvider, ...triggerCharacters: string[]): vscode.Disposable {
308
				return extHostLanguageFeatures.registerCompletionItemProvider(checkSelector(selector), provider, triggerCharacters);
309 310
			},
			registerDocumentLinkProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentLinkProvider): vscode.Disposable {
311
				return extHostLanguageFeatures.registerDocumentLinkProvider(checkSelector(selector), provider);
312
			},
313
			registerColorProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentColorProvider): vscode.Disposable {
314
				return extHostLanguageFeatures.registerColorProvider(checkSelector(selector), provider);
315
			},
316
			registerFoldingRangeProvider(selector: vscode.DocumentSelector, provider: vscode.FoldingRangeProvider): vscode.Disposable {
317
				return extHostLanguageFeatures.registerFoldingRangeProvider(checkSelector(selector), provider);
318
			},
319
			setLanguageConfiguration: (language: string, configuration: vscode.LanguageConfiguration): vscode.Disposable => {
320
				return extHostLanguageFeatures.setLanguageConfiguration(language, configuration);
321
			}
322
		};
E
Erich Gamma 已提交
323

324 325 326 327 328 329 330 331
		// namespace: window
		const window: typeof vscode.window = {
			get activeTextEditor() {
				return extHostEditors.getActiveTextEditor();
			},
			get visibleTextEditors() {
				return extHostEditors.getVisibleTextEditors();
			},
D
Daniel Imms 已提交
332
			get terminals() {
333
				return proposedApiFunction(extension, extHostTerminalService.terminals);
D
Daniel Imms 已提交
334
			},
J
Johannes Rieken 已提交
335
			showTextDocument(documentOrUri: vscode.TextDocument | vscode.Uri, columnOrOptions?: vscode.ViewColumn | vscode.TextDocumentShowOptions, preserveFocus?: boolean): TPromise<vscode.TextEditor> {
B
Benjamin Pasero 已提交
336
				let documentPromise: TPromise<vscode.TextDocument>;
J
Johannes Rieken 已提交
337 338
				if (URI.isUri(documentOrUri)) {
					documentPromise = TPromise.wrap(workspace.openTextDocument(documentOrUri));
B
Benjamin Pasero 已提交
339
				} else {
J
Johannes Rieken 已提交
340
					documentPromise = TPromise.wrap(<vscode.TextDocument>documentOrUri);
B
Benjamin Pasero 已提交
341 342 343 344
				}
				return documentPromise.then(document => {
					return extHostEditors.showTextDocument(document, columnOrOptions, preserveFocus);
				});
345 346 347 348
			},
			createTextEditorDecorationType(options: vscode.DecorationRenderOptions): vscode.TextEditorDecorationType {
				return extHostEditors.createTextEditorDecorationType(options);
			},
349 350 351
			onDidChangeActiveTextEditor(listener, thisArg?, disposables?) {
				return extHostEditors.onDidChangeActiveTextEditor(listener, thisArg, disposables);
			},
352 353 354
			onDidChangeVisibleTextEditors(listener, thisArg, disposables) {
				return extHostEditors.onDidChangeVisibleTextEditors(listener, thisArg, disposables);
			},
355
			onDidChangeTextEditorSelection(listener: (e: vscode.TextEditorSelectionChangeEvent) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) {
356 357
				return extHostEditors.onDidChangeTextEditorSelection(listener, thisArgs, disposables);
			},
358
			onDidChangeTextEditorOptions(listener: (e: vscode.TextEditorOptionsChangeEvent) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) {
359 360
				return extHostEditors.onDidChangeTextEditorOptions(listener, thisArgs, disposables);
			},
361
			onDidChangeTextEditorVisibleRanges(listener: (e: vscode.TextEditorVisibleRangesChangeEvent) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) {
362
				return extHostEditors.onDidChangeTextEditorVisibleRanges(listener, thisArgs, disposables);
363
			},
364 365 366
			onDidChangeTextEditorViewColumn(listener, thisArg?, disposables?) {
				return extHostEditors.onDidChangeTextEditorViewColumn(listener, thisArg, disposables);
			},
367 368 369
			onDidCloseTerminal(listener, thisArg?, disposables?) {
				return extHostTerminalService.onDidCloseTerminal(listener, thisArg, disposables);
			},
370
			onDidOpenTerminal: proposedApiFunction(extension, (listener, thisArg?, disposables?) => {
371
				return extHostTerminalService.onDidOpenTerminal(listener, thisArg, disposables);
372
			}),
J
Joao Moreno 已提交
373 374
			get state() {
				return extHostWindow.state;
375
			},
J
Joao Moreno 已提交
376
			onDidChangeWindowState(listener, thisArg?, disposables?) {
J
Joao Moreno 已提交
377
				return extHostWindow.onDidChangeWindowState(listener, thisArg, disposables);
J
Joao Moreno 已提交
378
			},
J
Joao Moreno 已提交
379
			showInformationMessage(message, first, ...rest) {
380
				return extHostMessageService.showMessage(extension, Severity.Info, message, first, rest);
381
			},
J
Joao Moreno 已提交
382
			showWarningMessage(message, first, ...rest) {
383
				return extHostMessageService.showMessage(extension, Severity.Warning, message, first, rest);
384
			},
J
Joao Moreno 已提交
385
			showErrorMessage(message, first, ...rest) {
386
				return extHostMessageService.showMessage(extension, Severity.Error, message, first, rest);
387
			},
C
Christof Marti 已提交
388
			showQuickPick(items: any, options: vscode.QuickPickOptions, token?: vscode.CancellationToken): any {
C
Christof Marti 已提交
389
				return extHostQuickOpen.showQuickPick(undefined, items, options, token);
390
			},
391
			showWorkspaceFolderPick(options: vscode.WorkspaceFolderPickOptions) {
392
				return extHostQuickOpen.showWorkspaceFolderPick(options);
393
			},
394
			showInputBox(options?: vscode.InputBoxOptions, token?: vscode.CancellationToken) {
C
Christof Marti 已提交
395 396
				return extHostQuickOpen.showInput(undefined, options, token);
			},
397 398 399 400 401 402
			showOpenDialog(options) {
				return extHostDialogs.showOpenDialog(options);
			},
			showSaveDialog(options) {
				return extHostDialogs.showSaveDialog(options);
			},
403
			createStatusBarItem(position?: vscode.StatusBarAlignment, priority?: number): vscode.StatusBarItem {
404
				return extHostStatusBar.createStatusBarEntry(extension.id, <number>position, priority);
405 406 407 408
			},
			setStatusBarMessage(text: string, timeoutOrThenable?: number | Thenable<any>): vscode.Disposable {
				return extHostStatusBar.setStatusBarMessage(text, timeoutOrThenable);
			},
409
			withScmProgress<R>(task: (progress: vscode.Progress<number>) => Thenable<R>) {
410
				console.warn(`[Deprecation Warning] function 'withScmProgress' is deprecated and should no longer be used. Use 'withProgress' instead.`);
411
				return extHostProgress.withProgress(extension, { location: extHostTypes.ProgressLocation.SourceControl }, (progress, token) => task({ report(n: number) { /*noop*/ } }));
J
Johannes Rieken 已提交
412
			},
413
			withProgress<R>(options: vscode.ProgressOptions, task: (progress: vscode.Progress<{ message?: string; worked?: number }>, token: vscode.CancellationToken) => Thenable<R>) {
J
Johannes Rieken 已提交
414
				return extHostProgress.withProgress(extension, options, task);
415
			},
416 417 418
			createOutputChannel(name: string): vscode.OutputChannel {
				return extHostOutputService.createOutputChannel(name);
			},
419
			createWebviewPanel(viewType: string, title: string, showOptions: vscode.ViewColumn | { viewColumn: vscode.ViewColumn, preserveFocus?: boolean }, options: vscode.WebviewPanelOptions & vscode.WebviewOptions): vscode.WebviewPanel {
420
				return extHostWebviews.createWebview(viewType, title, showOptions, options, extension.extensionLocation);
421
			},
422 423 424 425
			createTerminal(nameOrOptions: vscode.TerminalOptions | string, shellPath?: string, shellArgs?: string[]): vscode.Terminal {
				if (typeof nameOrOptions === 'object') {
					return extHostTerminalService.createTerminalFromOptions(<vscode.TerminalOptions>nameOrOptions);
				}
D
Daniel Imms 已提交
426
				return extHostTerminalService.createTerminal(<string>nameOrOptions, shellPath, shellArgs);
427
			},
428 429 430 431 432
			registerTreeDataProvider(viewId: string, treeDataProvider: vscode.TreeDataProvider<any>): vscode.Disposable {
				return extHostTreeViews.registerTreeDataProvider(viewId, treeDataProvider);
			},
			createTreeView(viewId: string, options: { treeDataProvider: vscode.TreeDataProvider<any> }): vscode.TreeView<any> {
				return extHostTreeViews.createTreeView(viewId, options);
S
Sandeep Somavarapu 已提交
433
			},
434 435
			// proposed API
			sampleFunction: proposedApiFunction(extension, () => {
436
				return extHostMessageService.showMessage(extension, Severity.Info, 'Hello Proposed Api!', {}, []);
437
			}),
438 439
			registerDecorationProvider: proposedApiFunction(extension, (provider: vscode.DecorationProvider) => {
				return extHostDecorations.registerDecorationProvider(provider, extension.id);
M
Matt Bierner 已提交
440
			}),
441 442 443
			registerWebviewPanelSerializer: proposedApiFunction(extension, (viewType: string, serializer: vscode.WebviewPanelSerializer) => {
				return extHostWebviews.registerWebviewPanelSerializer(viewType, serializer);
			}),
J
Joao Moreno 已提交
444 445
			registerProtocolHandler: proposedApiFunction(extension, (handler: vscode.ProtocolHandler) => {
				return extHostUrls.registerProtocolHandler(extension.id, handler);
446
			})
447
		};
E
Erich Gamma 已提交
448

449 450 451 452 453 454 455 456
		// namespace: workspace
		const workspace: typeof vscode.workspace = {
			get rootPath() {
				return extHostWorkspace.getPath();
			},
			set rootPath(value) {
				throw errors.readonly();
			},
457 458
			getWorkspaceFolder(resource) {
				return extHostWorkspace.getWorkspaceFolder(resource);
459
			},
460
			get workspaceFolders() {
461
				return extHostWorkspace.getWorkspaceFolders();
462
			},
463 464 465 466 467 468
			get name() {
				return extHostWorkspace.workspace ? extHostWorkspace.workspace.name : undefined;
			},
			set name(value) {
				throw errors.readonly();
			},
469 470 471
			updateWorkspaceFolders: (index, deleteCount, ...workspaceFoldersToAdd) => {
				return extHostWorkspace.updateWorkspaceFolders(extension, index, deleteCount || 0, ...workspaceFoldersToAdd);
			},
472
			onDidChangeWorkspaceFolders: function (listener, thisArgs?, disposables?) {
473
				return extHostWorkspace.onDidChangeWorkspace(listener, thisArgs, disposables);
474
			},
J
Johannes Rieken 已提交
475 476
			asRelativePath: (pathOrUri, includeWorkspace) => {
				return extHostWorkspace.getRelativePath(pathOrUri, includeWorkspace);
477 478
			},
			findFiles: (include, exclude, maxResults?, token?) => {
479
				return extHostWorkspace.findFiles(typeConverters.GlobPattern.from(include), typeConverters.GlobPattern.from(exclude), maxResults, extension.id, token);
480 481 482 483 484
			},
			saveAll: (includeUntitled?) => {
				return extHostWorkspace.saveAll(includeUntitled);
			},
			applyEdit(edit: vscode.WorkspaceEdit): TPromise<boolean> {
485
				return extHostEditors.applyWorkspaceEdit(edit);
486 487
			},
			createFileSystemWatcher: (pattern, ignoreCreate, ignoreChange, ignoreDelete): vscode.FileSystemWatcher => {
488
				return extHostFileSystemEvent.createFileSystemWatcher(typeConverters.GlobPattern.from(pattern), ignoreCreate, ignoreChange, ignoreDelete);
489 490 491 492 493 494 495
			},
			get textDocuments() {
				return extHostDocuments.getAllDocumentData().map(data => data.document);
			},
			set textDocuments(value) {
				throw errors.readonly();
			},
496
			openTextDocument(uriOrFileNameOrOptions?: vscode.Uri | string | { language?: string; content?: string; }) {
B
Benjamin Pasero 已提交
497 498
				let uriPromise: TPromise<URI>;

499
				let options = uriOrFileNameOrOptions as { language?: string; content?: string; };
B
Benjamin Pasero 已提交
500
				if (typeof uriOrFileNameOrOptions === 'string') {
B
Benjamin Pasero 已提交
501 502
					uriPromise = TPromise.as(URI.file(uriOrFileNameOrOptions));
				} else if (uriOrFileNameOrOptions instanceof URI) {
J
Johannes Rieken 已提交
503
					uriPromise = TPromise.as(uriOrFileNameOrOptions);
B
Benjamin Pasero 已提交
504 505
				} else if (!options || typeof options === 'object') {
					uriPromise = extHostDocuments.createDocumentData(options);
506
				} else {
B
Benjamin Pasero 已提交
507
					throw new Error('illegal argument - uriOrFileNameOrOptions');
508
				}
B
Benjamin Pasero 已提交
509 510 511 512 513 514

				return uriPromise.then(uri => {
					return extHostDocuments.ensureDocumentData(uri).then(() => {
						const data = extHostDocuments.getDocumentData(uri);
						return data && data.document;
					});
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529
				});
			},
			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?) => {
530
				return extHostDocumentSaveParticipant.getOnWillSaveTextDocumentEvent(extension)(listener, thisArgs, disposables);
531
			},
532
			onDidChangeConfiguration: (listener: (_: any) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) => {
533 534
				return extHostConfiguration.onDidChangeConfiguration(listener, thisArgs, disposables);
			},
535 536
			getConfiguration(section?: string, resource?: vscode.Uri): vscode.WorkspaceConfiguration {
				resource = arguments.length === 1 ? void 0 : resource;
S
Sandeep Somavarapu 已提交
537
				return extHostConfiguration.getConfiguration(section, resource, extension.id);
538
			},
539 540
			registerTextDocumentContentProvider(scheme: string, provider: vscode.TextDocumentContentProvider) {
				return extHostDocumentContentProviders.registerTextDocumentContentProvider(scheme, provider);
541
			},
542
			registerTaskProvider: (type: string, provider: vscode.TaskProvider) => {
543
				return extHostTask.registerTaskProvider(extension, provider);
J
Johannes Rieken 已提交
544
			},
545 546
			fetchTasks: proposedApiFunction(extension, (filter?: vscode.TaskFilter): Thenable<vscode.Task[]> => {
				return extHostTask.fetchTasks(filter);
547 548
			}),
			executeTask: proposedApiFunction(extension, (task: vscode.Task): Thenable<vscode.TaskExecution> => {
549
				return extHostTask.executeTask(extension, task);
550
			}),
551 552 553
			get taskExecutions(): vscode.TaskExecution[] {
				return extHostTask.taskExecutions;
			},
554 555 556 557 558 559
			onDidStartTask: (listeners, thisArgs?, disposables?) => {
				return extHostTask.onDidStartTask(listeners, thisArgs, disposables);
			},
			onDidEndTask: (listeners, thisArgs?, disposables?) => {
				return extHostTask.onDidEndTask(listeners, thisArgs, disposables);
			},
560
			registerFileSystemProvider(scheme, provider, options) {
561
				return extHostFileSystem.registerFileSystemProvider(scheme, provider, options);
562
			},
563 564 565
			registerDeprecatedFileSystemProvider: proposedApiFunction(extension, (scheme, provider) => {
				return extHostFileSystem.registerDeprecatedFileSystemProvider(scheme, provider);
			}),
566
			registerSearchProvider: proposedApiFunction(extension, (scheme, provider) => {
567
				return extHostSearch.registerSearchProvider(scheme, provider);
568 569 570 571
			}),
			onDidRenameResource: proposedApiFunction(extension, (listener, thisArg?, disposables?) => {
				return extHostDocuments.onDidRenameResource(listener, thisArg, disposables);
			}),
572
		};
573

574 575
		// namespace: scm
		const scm: typeof vscode.scm = {
576
			get inputBox() {
J
Joao Moreno 已提交
577
				return extHostSCM.getLastInputBox(extension);
578
			},
J
Joao Moreno 已提交
579 580
			createSourceControl(id: string, label: string, rootUri?: vscode.Uri) {
				return extHostSCM.createSourceControl(extension, id, label, rootUri);
J
Joao Moreno 已提交
581
			}
582
		};
J
Joao Moreno 已提交
583

584 585
		// namespace: debug
		const debug: typeof vscode.debug = {
586 587 588
			get activeDebugSession() {
				return extHostDebugService.activeDebugSession;
			},
589 590
			get activeDebugConsole() {
				return extHostDebugService.activeDebugConsole;
591
			},
592 593
			get breakpoints() {
				return extHostDebugService.breakpoints;
594
			},
595 596 597
			onDidStartDebugSession(listener, thisArg?, disposables?) {
				return extHostDebugService.onDidStartDebugSession(listener, thisArg, disposables);
			},
598
			onDidTerminateDebugSession(listener, thisArg?, disposables?) {
599
				return extHostDebugService.onDidTerminateDebugSession(listener, thisArg, disposables);
600
			},
A
Andre Weinand 已提交
601
			onDidChangeActiveDebugSession(listener, thisArg?, disposables?) {
602
				return extHostDebugService.onDidChangeActiveDebugSession(listener, thisArg, disposables);
A
Andre Weinand 已提交
603 604
			},
			onDidReceiveDebugSessionCustomEvent(listener, thisArg?, disposables?) {
A
Andre Weinand 已提交
605
				return extHostDebugService.onDidReceiveDebugSessionCustomEvent(listener, thisArg, disposables);
606
			},
607
			onDidChangeBreakpoints(listener, thisArgs?, disposables?) {
608 609
				return extHostDebugService.onDidChangeBreakpoints(listener, thisArgs, disposables);
			},
A
Andre Weinand 已提交
610
			registerDebugConfigurationProvider(debugType: string, provider: vscode.DebugConfigurationProvider) {
611
				return extHostDebugService.registerDebugConfigurationProvider(debugType, provider);
612
			},
613 614 615 616
			startDebugging(folder: vscode.WorkspaceFolder | undefined, nameOrConfig: string | vscode.DebugConfiguration) {
				return extHostDebugService.startDebugging(folder, nameOrConfig);
			},
			addBreakpoints(breakpoints: vscode.Breakpoint[]) {
617
				return extHostDebugService.addBreakpoints(breakpoints);
618 619
			},
			removeBreakpoints(breakpoints: vscode.Breakpoint[]) {
620
				return extHostDebugService.removeBreakpoints(breakpoints);
621
			}
622 623
		};

D
Dirk Baeumer 已提交
624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649
		const tasks: typeof vscode.tasks = {
			registerTaskProvider: (type: string, provider: vscode.TaskProvider) => {
				return extHostTask.registerTaskProvider(extension, provider);
			},
			fetchTasks: proposedApiFunction(extension, (filter?: vscode.TaskFilter): Thenable<vscode.Task[]> => {
				return extHostTask.fetchTasks(filter);
			}),
			executeTask: proposedApiFunction(extension, (task: vscode.Task): Thenable<vscode.TaskExecution> => {
				return extHostTask.executeTask(extension, task);
			}),
			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);
			}
		};
650

651
		return <typeof vscode>{
652 653 654 655 656 657 658 659
			version: pkg.version,
			// namespaces
			commands,
			env,
			extensions,
			languages,
			window,
			workspace,
J
Joao Moreno 已提交
660
			scm,
661
			debug,
D
Dirk Baeumer 已提交
662
			tasks,
663
			// types
664
			Breakpoint: extHostTypes.Breakpoint,
665
			CancellationTokenSource: CancellationTokenSource,
666
			CodeAction: extHostTypes.CodeAction,
M
Matt Bierner 已提交
667
			CodeActionKind: extHostTypes.CodeActionKind,
668
			CodeLens: extHostTypes.CodeLens,
669
			Color: extHostTypes.Color,
670 671
			ColorPresentation: extHostTypes.ColorPresentation,
			ColorInformation: extHostTypes.ColorInformation,
672
			CodeActionTrigger: extHostTypes.CodeActionTrigger,
673
			EndOfLine: extHostTypes.EndOfLine,
674 675 676
			CompletionItem: extHostTypes.CompletionItem,
			CompletionItemKind: extHostTypes.CompletionItemKind,
			CompletionList: extHostTypes.CompletionList,
M
Matt Bierner 已提交
677
			CompletionTriggerKind: extHostTypes.CompletionTriggerKind,
678
			DebugAdapterExecutable: extHostTypes.DebugAdapterExecutable,
679
			Diagnostic: extHostTypes.Diagnostic,
680
			DiagnosticRelatedInformation: extHostTypes.DiagnosticRelatedInformation,
681
			DiagnosticTag: extHostTypes.DiagnosticTag,
682 683 684 685
			DiagnosticSeverity: extHostTypes.DiagnosticSeverity,
			Disposable: extHostTypes.Disposable,
			DocumentHighlight: extHostTypes.DocumentHighlight,
			DocumentHighlightKind: extHostTypes.DocumentHighlightKind,
686
			DocumentLink: extHostTypes.DocumentLink,
687
			EventEmitter: Emitter,
688
			FunctionBreakpoint: extHostTypes.FunctionBreakpoint,
689
			Hover: extHostTypes.Hover,
690
			IndentAction: languageConfiguration.IndentAction,
691
			Location: extHostTypes.Location,
692
			LogLevel: extHostTypes.LogLevel,
693
			MarkdownString: extHostTypes.MarkdownString,
694
			OverviewRulerLane: OverviewRulerLane,
695 696 697 698 699 700 701
			ParameterInformation: extHostTypes.ParameterInformation,
			Position: extHostTypes.Position,
			Range: extHostTypes.Range,
			Selection: extHostTypes.Selection,
			SignatureHelp: extHostTypes.SignatureHelp,
			SignatureInformation: extHostTypes.SignatureInformation,
			SnippetString: extHostTypes.SnippetString,
702
			SourceBreakpoint: extHostTypes.SourceBreakpoint,
703 704
			StatusBarAlignment: extHostTypes.StatusBarAlignment,
			SymbolInformation: extHostTypes.SymbolInformation,
705 706
			SymbolInformation2: class extends extHostTypes.SymbolInformation2 {
				constructor(name, detail, kind, range, location) {
707
					checkProposedApiEnabled(extension);
708 709 710 711 712 713 714
					super(name, detail, kind, range, location);
				}
			},
			Hierarchy: class <T> extends extHostTypes.Hierarchy<T> {
				constructor(parent: T) {
					checkProposedApiEnabled(extension);
					super(parent);
715 716
				}
			},
717
			SymbolKind: extHostTypes.SymbolKind,
718
			SourceControlInputBoxValidationType: extHostTypes.SourceControlInputBoxValidationType,
719 720
			TextDocumentSaveReason: extHostTypes.TextDocumentSaveReason,
			TextEdit: extHostTypes.TextEdit,
721
			TextEditorCursorStyle: TextEditorCursorStyle,
722
			TextEditorLineNumbersStyle: extHostTypes.TextEditorLineNumbersStyle,
723
			TextEditorRevealType: extHostTypes.TextEditorRevealType,
724
			TextEditorSelectionChangeKind: extHostTypes.TextEditorSelectionChangeKind,
725
			DecorationRangeBehavior: extHostTypes.DecorationRangeBehavior,
726
			Uri: URI,
727 728
			ViewColumn: extHostTypes.ViewColumn,
			WorkspaceEdit: extHostTypes.WorkspaceEdit,
J
Johannes Rieken 已提交
729
			ProgressLocation: extHostTypes.ProgressLocation,
S
Sandeep Somavarapu 已提交
730
			TreeItemCollapsibleState: extHostTypes.TreeItemCollapsibleState,
731
			ThemeIcon: extHostTypes.ThemeIcon,
S
Sandeep Somavarapu 已提交
732
			TreeItem: extHostTypes.TreeItem,
733
			ThemeColor: extHostTypes.ThemeColor,
J
Joao Moreno 已提交
734
			// functions
735
			TaskRevealKind: extHostTypes.TaskRevealKind,
736
			TaskPanelKind: extHostTypes.TaskPanelKind,
737
			TaskGroup: extHostTypes.TaskGroup,
D
Dirk Baeumer 已提交
738 739
			ProcessExecution: extHostTypes.ProcessExecution,
			ShellExecution: extHostTypes.ShellExecution,
740
			ShellQuoting: extHostTypes.ShellQuoting,
D
Dirk Baeumer 已提交
741
			TaskScope: extHostTypes.TaskScope,
S
Sandeep Somavarapu 已提交
742
			Task: extHostTypes.Task,
743
			ConfigurationTarget: extHostTypes.ConfigurationTarget,
744
			RelativePattern: extHostTypes.RelativePattern,
745

746 747
			DeprecatedFileChangeType: extHostTypes.DeprecatedFileChangeType,
			DeprecatedFileType: extHostTypes.DeprecatedFileType,
J
Johannes Rieken 已提交
748
			FileChangeType: extHostTypes.FileChangeType,
749
			FileType: files.FileType,
750
			FileSystemError: extHostTypes.FileSystemError,
751
			FoldingRange: extHostTypes.FoldingRange,
752
			FoldingRangeKind: extHostTypes.FoldingRangeKind
753
		};
754
	};
E
Erich Gamma 已提交
755 756 757 758
}

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

A
Alex Dima 已提交
759
	private _extensionService: ExtHostExtensionService;
E
Erich Gamma 已提交
760 761 762 763 764

	public id: string;
	public extensionPath: string;
	public packageJSON: any;

J
Johannes Rieken 已提交
765
	constructor(extensionService: ExtHostExtensionService, description: IExtensionDescription) {
A
Alex Dima 已提交
766
		this._extensionService = extensionService;
E
Erich Gamma 已提交
767
		this.id = description.id;
768
		this.extensionPath = paths.normalize(description.extensionLocation.fsPath, true);
E
Erich Gamma 已提交
769 770 771 772
		this.packageJSON = description;
	}

	get isActive(): boolean {
A
Alex Dima 已提交
773
		return this._extensionService.isActivated(this.id);
E
Erich Gamma 已提交
774 775 776
	}

	get exports(): T {
A
Alex Dima 已提交
777
		return <T>this._extensionService.getExtensionExports(this.id);
E
Erich Gamma 已提交
778 779 780
	}

	activate(): Thenable<T> {
781
		return this._extensionService.activateByIdWithErrors(this.id, new ExtensionActivatedByAPI(false)).then(() => this.exports);
E
Erich Gamma 已提交
782 783 784
	}
}

J
Johannes Rieken 已提交
785
export function initializeExtensionApi(extensionService: ExtHostExtensionService, apiFactory: IExtensionApiFactory): TPromise<void> {
786
	return extensionService.getExtensionPathIndex().then(trie => defineAPI(apiFactory, trie));
J
Johannes Rieken 已提交
787 788
}

789
function defineAPI(factory: IExtensionApiFactory, extensionPaths: TernarySearchTree<IExtensionDescription>): void {
J
Johannes Rieken 已提交
790 791

	// each extension is meant to get its own api implementation
J
Johannes Rieken 已提交
792
	const extApiImpl = new Map<string, typeof vscode>();
J
Johannes Rieken 已提交
793
	let defaultApiImpl: typeof vscode;
794 795 796

	const node_module = <any>require.__$__nodeRequire('module');
	const original = node_module._load;
A
Alex Dima 已提交
797
	node_module._load = function load(request: string, parent: any, isMain: any) {
798 799 800 801 802
		if (request !== 'vscode') {
			return original.apply(this, arguments);
		}

		// get extension id from filename and api for extension
803
		const ext = extensionPaths.findSubstr(URI.file(parent.filename).fsPath);
804
		if (ext) {
J
Johannes Rieken 已提交
805
			let apiImpl = extApiImpl.get(ext.id);
806
			if (!apiImpl) {
J
Johannes Rieken 已提交
807 808
				apiImpl = factory(ext);
				extApiImpl.set(ext.id, apiImpl);
809 810 811 812 813 814
			}
			return apiImpl;
		}

		// fall back to a default implementation
		if (!defaultApiImpl) {
815
			console.warn(`Could not identify extension for 'vscode' require call from ${parent.filename}`);
816
			defaultApiImpl = factory(nullExtensionDescription);
E
Erich Gamma 已提交
817
		}
818
		return defaultApiImpl;
E
Erich Gamma 已提交
819 820
	};
}
821 822 823 824 825 826 827 828 829 830

const nullExtensionDescription: IExtensionDescription = {
	id: 'nullExtensionDescription',
	name: 'Null Extension Description',
	publisher: 'vscode',
	activationEvents: undefined,
	contributes: undefined,
	enableProposedApi: false,
	engines: undefined,
	extensionDependencies: undefined,
831
	extensionLocation: undefined,
832
	isBuiltin: false,
833
	isUnderDevelopment: false,
834 835 836
	main: undefined,
	version: undefined
};