From 488fa952c0ee8ee18c5ef739c6e35403ceba62ec Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 6 Nov 2018 11:52:57 +0100 Subject: [PATCH] add log messages for all language features (IntelliSense, formatting etc) fixes #43099 --- src/vs/workbench/api/node/extHost.api.impl.ts | 58 +++---- .../workbench/api/node/extHostFileSystem.ts | 18 ++- .../api/node/extHostLanguageFeatures.ts | 109 +++++++------ .../services/extensions/common/extensions.ts | 16 ++ .../api/extHostApiCommands.test.ts | 47 +++--- .../api/extHostLanguageFeatures.test.ts | 151 +++++++++--------- 6 files changed, 216 insertions(+), 183 deletions(-) diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 5ab71f4815f..3b49a1a9524 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -59,7 +59,7 @@ import { ExtHostUrls } from 'vs/workbench/api/node/extHostUrls'; import { ExtHostWebviews } from 'vs/workbench/api/node/extHostWebview'; import { ExtHostWindow } from 'vs/workbench/api/node/extHostWindow'; import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; -import { IExtensionDescription, throwProposedApiError, checkProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; +import { IExtensionDescription, throwProposedApiError, checkProposedApiEnabled, nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { ProxyIdentifier } from 'vs/workbench/services/extensions/node/proxyIdentifier'; import * as vscode from 'vscode'; @@ -273,64 +273,64 @@ export function createApiFactory( return score(typeConverters.LanguageSelector.from(selector), document.uri, document.languageId, true); }, registerCodeActionsProvider(selector: vscode.DocumentSelector, provider: vscode.CodeActionProvider, metadata?: vscode.CodeActionProviderMetadata): vscode.Disposable { - return extHostLanguageFeatures.registerCodeActionProvider(checkSelector(selector), provider, extension, metadata); + return extHostLanguageFeatures.registerCodeActionProvider(extension, checkSelector(selector), provider, metadata); }, registerCodeLensProvider(selector: vscode.DocumentSelector, provider: vscode.CodeLensProvider): vscode.Disposable { - return extHostLanguageFeatures.registerCodeLensProvider(checkSelector(selector), provider); + return extHostLanguageFeatures.registerCodeLensProvider(extension, checkSelector(selector), provider); }, registerDefinitionProvider(selector: vscode.DocumentSelector, provider: vscode.DefinitionProvider): vscode.Disposable { - return extHostLanguageFeatures.registerDefinitionProvider(checkSelector(selector), provider); + return extHostLanguageFeatures.registerDefinitionProvider(extension, checkSelector(selector), provider); }, registerImplementationProvider(selector: vscode.DocumentSelector, provider: vscode.ImplementationProvider): vscode.Disposable { - return extHostLanguageFeatures.registerImplementationProvider(checkSelector(selector), provider); + return extHostLanguageFeatures.registerImplementationProvider(extension, checkSelector(selector), provider); }, registerTypeDefinitionProvider(selector: vscode.DocumentSelector, provider: vscode.TypeDefinitionProvider): vscode.Disposable { - return extHostLanguageFeatures.registerTypeDefinitionProvider(checkSelector(selector), provider); + return extHostLanguageFeatures.registerTypeDefinitionProvider(extension, checkSelector(selector), provider); }, registerHoverProvider(selector: vscode.DocumentSelector, provider: vscode.HoverProvider): vscode.Disposable { - return extHostLanguageFeatures.registerHoverProvider(checkSelector(selector), provider, extension.id); + return extHostLanguageFeatures.registerHoverProvider(extension, checkSelector(selector), provider, extension.id); }, registerDocumentHighlightProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentHighlightProvider): vscode.Disposable { - return extHostLanguageFeatures.registerDocumentHighlightProvider(checkSelector(selector), provider); + return extHostLanguageFeatures.registerDocumentHighlightProvider(extension, checkSelector(selector), provider); }, registerReferenceProvider(selector: vscode.DocumentSelector, provider: vscode.ReferenceProvider): vscode.Disposable { - return extHostLanguageFeatures.registerReferenceProvider(checkSelector(selector), provider); + return extHostLanguageFeatures.registerReferenceProvider(extension, checkSelector(selector), provider); }, registerRenameProvider(selector: vscode.DocumentSelector, provider: vscode.RenameProvider): vscode.Disposable { - return extHostLanguageFeatures.registerRenameProvider(checkSelector(selector), provider); + return extHostLanguageFeatures.registerRenameProvider(extension, checkSelector(selector), provider); }, registerDocumentSymbolProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentSymbolProvider): vscode.Disposable { - return extHostLanguageFeatures.registerDocumentSymbolProvider(checkSelector(selector), provider, extension); + return extHostLanguageFeatures.registerDocumentSymbolProvider(extension, checkSelector(selector), provider); }, registerWorkspaceSymbolProvider(provider: vscode.WorkspaceSymbolProvider): vscode.Disposable { - return extHostLanguageFeatures.registerWorkspaceSymbolProvider(provider); + return extHostLanguageFeatures.registerWorkspaceSymbolProvider(extension, provider); }, registerDocumentFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentFormattingEditProvider): vscode.Disposable { - return extHostLanguageFeatures.registerDocumentFormattingEditProvider(checkSelector(selector), provider); + return extHostLanguageFeatures.registerDocumentFormattingEditProvider(extension, checkSelector(selector), provider); }, registerDocumentRangeFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentRangeFormattingEditProvider): vscode.Disposable { - return extHostLanguageFeatures.registerDocumentRangeFormattingEditProvider(checkSelector(selector), provider); + return extHostLanguageFeatures.registerDocumentRangeFormattingEditProvider(extension, checkSelector(selector), provider); }, registerOnTypeFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.OnTypeFormattingEditProvider, firstTriggerCharacter: string, ...moreTriggerCharacters: string[]): vscode.Disposable { - return extHostLanguageFeatures.registerOnTypeFormattingEditProvider(checkSelector(selector), provider, [firstTriggerCharacter].concat(moreTriggerCharacters)); + return extHostLanguageFeatures.registerOnTypeFormattingEditProvider(extension, checkSelector(selector), provider, [firstTriggerCharacter].concat(moreTriggerCharacters)); }, registerSignatureHelpProvider(selector: vscode.DocumentSelector, provider: vscode.SignatureHelpProvider, firstItem?: string | vscode.SignatureHelpProviderMetadata, ...remaining: string[]): vscode.Disposable { if (typeof firstItem === 'object') { - return extHostLanguageFeatures.registerSignatureHelpProvider(checkSelector(selector), provider, firstItem); + return extHostLanguageFeatures.registerSignatureHelpProvider(extension, checkSelector(selector), provider, firstItem); } - return extHostLanguageFeatures.registerSignatureHelpProvider(checkSelector(selector), provider, typeof firstItem === 'undefined' ? [] : [firstItem, ...remaining]); + return extHostLanguageFeatures.registerSignatureHelpProvider(extension, checkSelector(selector), provider, typeof firstItem === 'undefined' ? [] : [firstItem, ...remaining]); }, registerCompletionItemProvider(selector: vscode.DocumentSelector, provider: vscode.CompletionItemProvider, ...triggerCharacters: string[]): vscode.Disposable { - return extHostLanguageFeatures.registerCompletionItemProvider(checkSelector(selector), provider, triggerCharacters); + return extHostLanguageFeatures.registerCompletionItemProvider(extension, checkSelector(selector), provider, triggerCharacters); }, registerDocumentLinkProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentLinkProvider): vscode.Disposable { - return extHostLanguageFeatures.registerDocumentLinkProvider(checkSelector(selector), provider); + return extHostLanguageFeatures.registerDocumentLinkProvider(extension, checkSelector(selector), provider); }, registerColorProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentColorProvider): vscode.Disposable { - return extHostLanguageFeatures.registerColorProvider(checkSelector(selector), provider); + return extHostLanguageFeatures.registerColorProvider(extension, checkSelector(selector), provider); }, registerFoldingRangeProvider(selector: vscode.DocumentSelector, provider: vscode.FoldingRangeProvider): vscode.Disposable { - return extHostLanguageFeatures.registerFoldingRangeProvider(checkSelector(selector), provider); + return extHostLanguageFeatures.registerFoldingRangeProvider(extension, checkSelector(selector), provider); }, setLanguageConfiguration: (language: string, configuration: vscode.LanguageConfiguration): vscode.Disposable => { return extHostLanguageFeatures.setLanguageConfiguration(language, configuration); @@ -872,19 +872,3 @@ function defineAPI(factory: IExtensionApiFactory, extensionPaths: TernarySearchT return defaultApiImpl; }; } - -const nullExtensionDescription: IExtensionDescription = { - id: 'nullExtensionDescription', - name: 'Null Extension Description', - publisher: 'vscode', - activationEvents: undefined, - contributes: undefined, - enableProposedApi: false, - engines: undefined, - extensionDependencies: undefined, - extensionLocation: undefined, - isBuiltin: false, - isUnderDevelopment: false, - main: undefined, - version: undefined -}; diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 60ad98ac297..6bdc935edf4 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -7,7 +7,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { MainContext, IMainContext, ExtHostFileSystemShape, MainThreadFileSystemShape, IFileChangeDto } from './extHost.protocol'; import * as vscode from 'vscode'; import * as files from 'vs/platform/files/common/files'; -import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; import { values } from 'vs/base/common/map'; import { Range, FileChangeType } from 'vs/workbench/api/node/extHostTypes'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/node/extHostLanguageFeatures'; @@ -64,9 +64,10 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { private readonly _usedSchemes = new Set(); private readonly _watches = new Map(); + private _linkProviderRegistration: IDisposable; private _handlePool: number = 0; - constructor(mainContext: IMainContext, extHostLanguageFeatures: ExtHostLanguageFeatures) { + constructor(mainContext: IMainContext, private _extHostLanguageFeatures: ExtHostLanguageFeatures) { this._proxy = mainContext.getProxy(MainContext.MainThreadFileSystem); this._usedSchemes.add(Schemas.file); this._usedSchemes.add(Schemas.untitled); @@ -77,8 +78,16 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { this._usedSchemes.add(Schemas.https); this._usedSchemes.add(Schemas.mailto); this._usedSchemes.add(Schemas.data); + } - extHostLanguageFeatures.registerDocumentLinkProvider('*', this._linkProvider); + dispose(): void { + dispose(this._linkProviderRegistration); + } + + private _registerLinkProviderIfNotYetRegistered(): void { + if (!this._linkProviderRegistration) { + this._linkProviderRegistration = this._extHostLanguageFeatures.registerDocumentLinkProvider(undefined, '*', this._linkProvider); + } } registerFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider, options: { isCaseSensitive?: boolean, isReadonly?: boolean } = {}) { @@ -87,6 +96,9 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { throw new Error(`a provider for the scheme '${scheme}' is already registered`); } + // + this._registerLinkProviderIfNotYetRegistered(); + const handle = this._handlePool++; this._linkProvider.add(scheme); this._usedSchemes.add(scheme); diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index bb9eae10264..fd9a617a2e2 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -842,6 +842,13 @@ type Adapter = OutlineAdapter | CodeLensAdapter | DefinitionAdapter | HoverAdapt | SuggestAdapter | SignatureHelpAdapter | LinkProviderAdapter | ImplementationAdapter | TypeDefinitionAdapter | ColorProviderAdapter | FoldingProviderAdapter; +class AdapterData { + constructor( + readonly adapter: Adapter, + readonly extension: IExtensionDescription | undefined + ) { } +} + export interface ISchemeTransformer { transformOutgoing(scheme: string): string; } @@ -856,7 +863,7 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { private _commands: ExtHostCommands; private _heapService: ExtHostHeapService; private _diagnostics: ExtHostDiagnostics; - private _adapter = new Map(); + private _adapter = new Map(); private readonly _logService: ILogService; constructor( @@ -925,23 +932,35 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { } private _withAdapter(handle: number, ctor: { new(...args: any[]): A }, callback: (adapter: A) => Thenable): Thenable { - let adapter = this._adapter.get(handle); - if (!(adapter instanceof ctor)) { - return Promise.reject(new Error('no adapter found')); + let data = this._adapter.get(handle); + if (data.adapter instanceof ctor) { + let t1: number; + if (data.extension) { + t1 = Date.now(); + this._logService.trace(`[${data.extension.id}] INVOKE provider '${(ctor as any).name}'`); + } + let p = callback(data.adapter); + if (data.extension) { + Promise.resolve(p).then( + () => this._logService.trace(`[${data.extension.id}] provider DONE after ${Date.now() - t1}ms`), + err => this._logService.trace(`[${data.extension.id}] provider FAILED`, err) + ); + } + return p; } - return callback(adapter); + return Promise.reject(new Error('no adapter found')); } - private _addNewAdapter(adapter: Adapter): number { + private _addNewAdapter(adapter: Adapter, extension: IExtensionDescription): number { const handle = this._nextHandle(); - this._adapter.set(handle, adapter); + this._adapter.set(handle, new AdapterData(adapter, extension)); return handle; } // --- outline - registerDocumentSymbolProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentSymbolProvider, extension?: IExtensionDescription): vscode.Disposable { - const handle = this._addNewAdapter(new OutlineAdapter(this._documents, provider)); + registerDocumentSymbolProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentSymbolProvider): vscode.Disposable { + const handle = this._addNewAdapter(new OutlineAdapter(this._documents, provider), extension); this._proxy.$registerOutlineSupport(handle, this._transformDocumentSelector(selector), extension ? extension.displayName || extension.name : undefined); return this._createDisposable(handle); } @@ -952,11 +971,11 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { // --- code lens - registerCodeLensProvider(selector: vscode.DocumentSelector, provider: vscode.CodeLensProvider): vscode.Disposable { + registerCodeLensProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.CodeLensProvider): vscode.Disposable { const handle = this._nextHandle(); const eventHandle = typeof provider.onDidChangeCodeLenses === 'function' ? this._nextHandle() : undefined; - this._adapter.set(handle, new CodeLensAdapter(this._documents, this._commands.converter, this._heapService, provider)); + this._adapter.set(handle, new AdapterData(new CodeLensAdapter(this._documents, this._commands.converter, this._heapService, provider), extension)); this._proxy.$registerCodeLensSupport(handle, this._transformDocumentSelector(selector), eventHandle); let result = this._createDisposable(handle); @@ -978,8 +997,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { // --- declaration - registerDefinitionProvider(selector: vscode.DocumentSelector, provider: vscode.DefinitionProvider): vscode.Disposable { - const handle = this._addNewAdapter(new DefinitionAdapter(this._documents, provider)); + registerDefinitionProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DefinitionProvider): vscode.Disposable { + const handle = this._addNewAdapter(new DefinitionAdapter(this._documents, provider), extension); this._proxy.$registerDeclaractionSupport(handle, this._transformDocumentSelector(selector)); return this._createDisposable(handle); } @@ -988,8 +1007,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return this._withAdapter(handle, DefinitionAdapter, adapter => adapter.provideDefinition(URI.revive(resource), position, token)); } - registerImplementationProvider(selector: vscode.DocumentSelector, provider: vscode.ImplementationProvider): vscode.Disposable { - const handle = this._addNewAdapter(new ImplementationAdapter(this._documents, provider)); + registerImplementationProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.ImplementationProvider): vscode.Disposable { + const handle = this._addNewAdapter(new ImplementationAdapter(this._documents, provider), extension); this._proxy.$registerImplementationSupport(handle, this._transformDocumentSelector(selector)); return this._createDisposable(handle); } @@ -998,8 +1017,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return this._withAdapter(handle, ImplementationAdapter, adapter => adapter.provideImplementation(URI.revive(resource), position, token)); } - registerTypeDefinitionProvider(selector: vscode.DocumentSelector, provider: vscode.TypeDefinitionProvider): vscode.Disposable { - const handle = this._addNewAdapter(new TypeDefinitionAdapter(this._documents, provider)); + registerTypeDefinitionProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.TypeDefinitionProvider): vscode.Disposable { + const handle = this._addNewAdapter(new TypeDefinitionAdapter(this._documents, provider), extension); this._proxy.$registerTypeDefinitionSupport(handle, this._transformDocumentSelector(selector)); return this._createDisposable(handle); } @@ -1010,8 +1029,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { // --- extra info - registerHoverProvider(selector: vscode.DocumentSelector, provider: vscode.HoverProvider, extensionId?: string): vscode.Disposable { - const handle = this._addNewAdapter(new HoverAdapter(this._documents, provider)); + registerHoverProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.HoverProvider, extensionId?: string): vscode.Disposable { + const handle = this._addNewAdapter(new HoverAdapter(this._documents, provider), extension); this._proxy.$registerHoverProvider(handle, this._transformDocumentSelector(selector)); return this._createDisposable(handle); } @@ -1022,8 +1041,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { // --- occurrences - registerDocumentHighlightProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentHighlightProvider): vscode.Disposable { - const handle = this._addNewAdapter(new DocumentHighlightAdapter(this._documents, provider)); + registerDocumentHighlightProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentHighlightProvider): vscode.Disposable { + const handle = this._addNewAdapter(new DocumentHighlightAdapter(this._documents, provider), extension); this._proxy.$registerDocumentHighlightProvider(handle, this._transformDocumentSelector(selector)); return this._createDisposable(handle); } @@ -1034,8 +1053,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { // --- references - registerReferenceProvider(selector: vscode.DocumentSelector, provider: vscode.ReferenceProvider): vscode.Disposable { - const handle = this._addNewAdapter(new ReferenceAdapter(this._documents, provider)); + registerReferenceProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.ReferenceProvider): vscode.Disposable { + const handle = this._addNewAdapter(new ReferenceAdapter(this._documents, provider), extension); this._proxy.$registerReferenceSupport(handle, this._transformDocumentSelector(selector)); return this._createDisposable(handle); } @@ -1046,8 +1065,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { // --- quick fix - registerCodeActionProvider(selector: vscode.DocumentSelector, provider: vscode.CodeActionProvider, extension?: IExtensionDescription, metadata?: vscode.CodeActionProviderMetadata): vscode.Disposable { - const handle = this._addNewAdapter(new CodeActionAdapter(this._documents, this._commands.converter, this._diagnostics, provider, this._logService, extension ? extension.id : '')); + registerCodeActionProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.CodeActionProvider, metadata?: vscode.CodeActionProviderMetadata): vscode.Disposable { + const handle = this._addNewAdapter(new CodeActionAdapter(this._documents, this._commands.converter, this._diagnostics, provider, this._logService, extension.id), extension); this._proxy.$registerQuickFixSupport(handle, this._transformDocumentSelector(selector), metadata && metadata.providedCodeActionKinds ? metadata.providedCodeActionKinds.map(kind => kind.value) : undefined); return this._createDisposable(handle); } @@ -1059,8 +1078,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { // --- formatting - registerDocumentFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentFormattingEditProvider): vscode.Disposable { - const handle = this._addNewAdapter(new DocumentFormattingAdapter(this._documents, provider)); + registerDocumentFormattingEditProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentFormattingEditProvider): vscode.Disposable { + const handle = this._addNewAdapter(new DocumentFormattingAdapter(this._documents, provider), extension); this._proxy.$registerDocumentFormattingSupport(handle, this._transformDocumentSelector(selector)); return this._createDisposable(handle); } @@ -1069,8 +1088,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return this._withAdapter(handle, DocumentFormattingAdapter, adapter => adapter.provideDocumentFormattingEdits(URI.revive(resource), options, token)); } - registerDocumentRangeFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentRangeFormattingEditProvider): vscode.Disposable { - const handle = this._addNewAdapter(new RangeFormattingAdapter(this._documents, provider)); + registerDocumentRangeFormattingEditProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentRangeFormattingEditProvider): vscode.Disposable { + const handle = this._addNewAdapter(new RangeFormattingAdapter(this._documents, provider), extension); this._proxy.$registerRangeFormattingSupport(handle, this._transformDocumentSelector(selector)); return this._createDisposable(handle); } @@ -1079,8 +1098,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return this._withAdapter(handle, RangeFormattingAdapter, adapter => adapter.provideDocumentRangeFormattingEdits(URI.revive(resource), range, options, token)); } - registerOnTypeFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.OnTypeFormattingEditProvider, triggerCharacters: string[]): vscode.Disposable { - const handle = this._addNewAdapter(new OnTypeFormattingAdapter(this._documents, provider)); + registerOnTypeFormattingEditProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.OnTypeFormattingEditProvider, triggerCharacters: string[]): vscode.Disposable { + const handle = this._addNewAdapter(new OnTypeFormattingAdapter(this._documents, provider), extension); this._proxy.$registerOnTypeFormattingSupport(handle, this._transformDocumentSelector(selector), triggerCharacters); return this._createDisposable(handle); } @@ -1091,8 +1110,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { // --- navigate types - registerWorkspaceSymbolProvider(provider: vscode.WorkspaceSymbolProvider): vscode.Disposable { - const handle = this._addNewAdapter(new NavigateTypeAdapter(provider)); + registerWorkspaceSymbolProvider(extension: IExtensionDescription, provider: vscode.WorkspaceSymbolProvider): vscode.Disposable { + const handle = this._addNewAdapter(new NavigateTypeAdapter(provider), extension); this._proxy.$registerNavigateTypeSupport(handle); return this._createDisposable(handle); } @@ -1111,8 +1130,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { // --- rename - registerRenameProvider(selector: vscode.DocumentSelector, provider: vscode.RenameProvider): vscode.Disposable { - const handle = this._addNewAdapter(new RenameAdapter(this._documents, provider)); + registerRenameProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.RenameProvider): vscode.Disposable { + const handle = this._addNewAdapter(new RenameAdapter(this._documents, provider), extension); this._proxy.$registerRenameSupport(handle, this._transformDocumentSelector(selector), RenameAdapter.supportsResolving(provider)); return this._createDisposable(handle); } @@ -1127,8 +1146,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { // --- suggestion - registerCompletionItemProvider(selector: vscode.DocumentSelector, provider: vscode.CompletionItemProvider, triggerCharacters: string[]): vscode.Disposable { - const handle = this._addNewAdapter(new SuggestAdapter(this._documents, this._commands.converter, provider)); + registerCompletionItemProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.CompletionItemProvider, triggerCharacters: string[]): vscode.Disposable { + const handle = this._addNewAdapter(new SuggestAdapter(this._documents, this._commands.converter, provider), extension); this._proxy.$registerSuggestSupport(handle, this._transformDocumentSelector(selector), triggerCharacters, SuggestAdapter.supportsResolving(provider)); return this._createDisposable(handle); } @@ -1147,12 +1166,12 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { // --- parameter hints - registerSignatureHelpProvider(selector: vscode.DocumentSelector, provider: vscode.SignatureHelpProvider, metadataOrTriggerChars?: string[] | vscode.SignatureHelpProviderMetadata): vscode.Disposable { + registerSignatureHelpProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.SignatureHelpProvider, metadataOrTriggerChars?: string[] | vscode.SignatureHelpProviderMetadata): vscode.Disposable { const metadata: ISerializedSignatureHelpProviderMetadata = Array.isArray(metadataOrTriggerChars) ? { triggerCharacters: metadataOrTriggerChars, retriggerCharacters: [] } : metadataOrTriggerChars; - const handle = this._addNewAdapter(new SignatureHelpAdapter(this._documents, provider)); + const handle = this._addNewAdapter(new SignatureHelpAdapter(this._documents, provider), extension); this._proxy.$registerSignatureHelpProvider(handle, this._transformDocumentSelector(selector), metadata); return this._createDisposable(handle); } @@ -1163,8 +1182,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { // --- links - registerDocumentLinkProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentLinkProvider): vscode.Disposable { - const handle = this._addNewAdapter(new LinkProviderAdapter(this._documents, this._heapService, provider)); + registerDocumentLinkProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentLinkProvider): vscode.Disposable { + const handle = this._addNewAdapter(new LinkProviderAdapter(this._documents, this._heapService, provider), extension); this._proxy.$registerDocumentLinkProvider(handle, this._transformDocumentSelector(selector)); return this._createDisposable(handle); } @@ -1177,8 +1196,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return this._withAdapter(handle, LinkProviderAdapter, adapter => adapter.resolveLink(link, token)); } - registerColorProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentColorProvider): vscode.Disposable { - const handle = this._addNewAdapter(new ColorProviderAdapter(this._documents, provider)); + registerColorProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentColorProvider): vscode.Disposable { + const handle = this._addNewAdapter(new ColorProviderAdapter(this._documents, provider), extension); this._proxy.$registerDocumentColorProvider(handle, this._transformDocumentSelector(selector)); return this._createDisposable(handle); } @@ -1191,8 +1210,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return this._withAdapter(handle, ColorProviderAdapter, adapter => adapter.provideColorPresentations(URI.revive(resource), colorInfo, token)); } - registerFoldingRangeProvider(selector: vscode.DocumentSelector, provider: vscode.FoldingRangeProvider): vscode.Disposable { - const handle = this._addNewAdapter(new FoldingProviderAdapter(this._documents, provider)); + registerFoldingRangeProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.FoldingRangeProvider): vscode.Disposable { + const handle = this._addNewAdapter(new FoldingProviderAdapter(this._documents, provider), extension); this._proxy.$registerFoldingRangeProvider(handle, this._transformDocumentSelector(selector)); return this._createDisposable(handle); } diff --git a/src/vs/workbench/services/extensions/common/extensions.ts b/src/vs/workbench/services/extensions/common/extensions.ts index 375a98a423c..19f262e9a90 100644 --- a/src/vs/workbench/services/extensions/common/extensions.ts +++ b/src/vs/workbench/services/extensions/common/extensions.ts @@ -34,6 +34,22 @@ export interface IExtensionDescription { enableProposedApi?: boolean; } +export const nullExtensionDescription: IExtensionDescription = Object.freeze({ + id: 'nullExtensionDescription', + name: 'Null Extension Description', + publisher: 'vscode', + activationEvents: undefined, + contributes: undefined, + enableProposedApi: false, + engines: undefined, + extensionDependencies: undefined, + extensionLocation: undefined, + isBuiltin: false, + isUnderDevelopment: false, + main: undefined, + version: undefined +}); + export const IExtensionService = createDecorator('extensionService'); export interface IMessage { diff --git a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts index d69dd86e87b..8dfcbd3d4c4 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts @@ -30,6 +30,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import 'vs/workbench/parts/search/electron-browser/search.contribution'; import { NullLogService } from 'vs/platform/log/common/log'; import { ITextModel } from 'vs/editor/common/model'; +import { nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; const defaultSelector = { scheme: 'far' }; const model: ITextModel = EditorModel.createFromString( @@ -158,7 +159,7 @@ suite('ExtHostLanguageFeatureCommands', function () { test('WorkspaceSymbols, back and forth', function () { - disposables.push(extHost.registerWorkspaceSymbolProvider({ + disposables.push(extHost.registerWorkspaceSymbolProvider(nullExtensionDescription, { provideWorkspaceSymbols(query): any { return [ new types.SymbolInformation(query, types.SymbolKind.Array, new types.Range(0, 0, 1, 1), URI.parse('far://testing/first')), @@ -167,7 +168,7 @@ suite('ExtHostLanguageFeatureCommands', function () { } })); - disposables.push(extHost.registerWorkspaceSymbolProvider({ + disposables.push(extHost.registerWorkspaceSymbolProvider(nullExtensionDescription, { provideWorkspaceSymbols(query): any { return [ new types.SymbolInformation(query, types.SymbolKind.Array, new types.Range(0, 0, 1, 1), URI.parse('far://testing/first')) @@ -190,7 +191,7 @@ suite('ExtHostLanguageFeatureCommands', function () { test('executeWorkspaceSymbolProvider should accept empty string, #39522', async function () { - disposables.push(extHost.registerWorkspaceSymbolProvider({ + disposables.push(extHost.registerWorkspaceSymbolProvider(nullExtensionDescription, { provideWorkspaceSymbols(query) { return [new types.SymbolInformation('hello', types.SymbolKind.Array, new types.Range(0, 0, 0, 0), URI.parse('foo:bar'))]; } @@ -220,12 +221,12 @@ suite('ExtHostLanguageFeatureCommands', function () { test('Definition, back and forth', function () { - disposables.push(extHost.registerDefinitionProvider(defaultSelector, { + disposables.push(extHost.registerDefinitionProvider(nullExtensionDescription, defaultSelector, { provideDefinition(doc: any): any { return new types.Location(doc.uri, new types.Range(0, 0, 0, 0)); } })); - disposables.push(extHost.registerDefinitionProvider(defaultSelector, { + disposables.push(extHost.registerDefinitionProvider(nullExtensionDescription, defaultSelector, { provideDefinition(doc: any): any { return [ new types.Location(doc.uri, new types.Range(0, 0, 0, 0)), @@ -261,12 +262,12 @@ suite('ExtHostLanguageFeatureCommands', function () { test('Type Definition, back and forth', function () { - disposables.push(extHost.registerTypeDefinitionProvider(defaultSelector, { + disposables.push(extHost.registerTypeDefinitionProvider(nullExtensionDescription, defaultSelector, { provideTypeDefinition(doc: any): any { return new types.Location(doc.uri, new types.Range(0, 0, 0, 0)); } })); - disposables.push(extHost.registerTypeDefinitionProvider(defaultSelector, { + disposables.push(extHost.registerTypeDefinitionProvider(nullExtensionDescription, defaultSelector, { provideTypeDefinition(doc: any): any { return [ new types.Location(doc.uri, new types.Range(0, 0, 0, 0)), @@ -291,7 +292,7 @@ suite('ExtHostLanguageFeatureCommands', function () { test('reference search, back and forth', function () { - disposables.push(extHost.registerReferenceProvider(defaultSelector, { + disposables.push(extHost.registerReferenceProvider(nullExtensionDescription, defaultSelector, { provideReferences(doc: any) { return [ new types.Location(URI.parse('some:uri/path'), new types.Range(0, 1, 0, 5)) @@ -313,7 +314,7 @@ suite('ExtHostLanguageFeatureCommands', function () { // --- outline test('Outline, back and forth', function () { - disposables.push(extHost.registerDocumentSymbolProvider(defaultSelector, { + disposables.push(extHost.registerDocumentSymbolProvider(nullExtensionDescription, defaultSelector, { provideDocumentSymbols(): any { return [ new types.SymbolInformation('testing1', types.SymbolKind.Enum, new types.Range(1, 0, 1, 0)), @@ -335,14 +336,14 @@ suite('ExtHostLanguageFeatureCommands', function () { }); test('vscode.executeDocumentSymbolProvider command only returns SymbolInformation[] rather than DocumentSymbol[] #57984', function () { - disposables.push(extHost.registerDocumentSymbolProvider(defaultSelector, { + disposables.push(extHost.registerDocumentSymbolProvider(nullExtensionDescription, defaultSelector, { provideDocumentSymbols(): any { return [ new types.SymbolInformation('SymbolInformation', types.SymbolKind.Enum, new types.Range(1, 0, 1, 0)) ]; } })); - disposables.push(extHost.registerDocumentSymbolProvider(defaultSelector, { + disposables.push(extHost.registerDocumentSymbolProvider(nullExtensionDescription, defaultSelector, { provideDocumentSymbols(): any { let root = new types.DocumentSymbol('DocumentSymbol', 'DocumentSymbol#detail', types.SymbolKind.Enum, new types.Range(1, 0, 1, 0), new types.Range(1, 0, 1, 0)); root.children = [new types.DocumentSymbol('DocumentSymbol#child', 'DocumentSymbol#detail#child', types.SymbolKind.Enum, new types.Range(1, 0, 1, 0), new types.Range(1, 0, 1, 0))]; @@ -367,7 +368,7 @@ suite('ExtHostLanguageFeatureCommands', function () { // --- suggest test('Suggest, back and forth', function () { - disposables.push(extHost.registerCompletionItemProvider(defaultSelector, { + disposables.push(extHost.registerCompletionItemProvider(nullExtensionDescription, defaultSelector, { provideCompletionItems(doc, pos): any { let a = new types.CompletionItem('item1'); let b = new types.CompletionItem('item2'); @@ -425,7 +426,7 @@ suite('ExtHostLanguageFeatureCommands', function () { }); test('Suggest, return CompletionList !array', function () { - disposables.push(extHost.registerCompletionItemProvider(defaultSelector, { + disposables.push(extHost.registerCompletionItemProvider(nullExtensionDescription, defaultSelector, { provideCompletionItems(): any { let a = new types.CompletionItem('item1'); let b = new types.CompletionItem('item2'); @@ -445,7 +446,7 @@ suite('ExtHostLanguageFeatureCommands', function () { let resolveCount = 0; - disposables.push(extHost.registerCompletionItemProvider(defaultSelector, { + disposables.push(extHost.registerCompletionItemProvider(nullExtensionDescription, defaultSelector, { provideCompletionItems(): any { let a = new types.CompletionItem('item1'); let b = new types.CompletionItem('item2'); @@ -475,7 +476,7 @@ suite('ExtHostLanguageFeatureCommands', function () { }); test('"vscode.executeCompletionItemProvider" doesnot return a preselect field #53749', async function () { - disposables.push(extHost.registerCompletionItemProvider(defaultSelector, { + disposables.push(extHost.registerCompletionItemProvider(nullExtensionDescription, defaultSelector, { provideCompletionItems(): any { let a = new types.CompletionItem('item1'); a.preselect = true; @@ -507,7 +508,7 @@ suite('ExtHostLanguageFeatureCommands', function () { }); test('executeCompletionItemProvider doesn\'t capture commitCharacters #58228', async function () { - disposables.push(extHost.registerCompletionItemProvider(defaultSelector, { + disposables.push(extHost.registerCompletionItemProvider(nullExtensionDescription, defaultSelector, { provideCompletionItems(): any { let a = new types.CompletionItem('item1'); a.commitCharacters = ['a', 'b']; @@ -536,7 +537,7 @@ suite('ExtHostLanguageFeatureCommands', function () { // --- quickfix test('QuickFix, back and forth', function () { - disposables.push(extHost.registerCodeActionProvider(defaultSelector, { + disposables.push(extHost.registerCodeActionProvider(nullExtensionDescription, defaultSelector, { provideCodeActions(): vscode.Command[] { return [{ command: 'testing', title: 'Title', arguments: [1, 2, true] }]; } @@ -554,7 +555,7 @@ suite('ExtHostLanguageFeatureCommands', function () { }); test('vscode.executeCodeActionProvider results seem to be missing their `command` property #45124', function () { - disposables.push(extHost.registerCodeActionProvider(defaultSelector, { + disposables.push(extHost.registerCodeActionProvider(nullExtensionDescription, defaultSelector, { provideCodeActions(document, range): vscode.CodeAction[] { return [{ command: { @@ -592,7 +593,7 @@ suite('ExtHostLanguageFeatureCommands', function () { big: extHost }; - disposables.push(extHost.registerCodeLensProvider(defaultSelector, { + disposables.push(extHost.registerCodeLensProvider(nullExtensionDescription, defaultSelector, { provideCodeLenses(): any { return [new types.CodeLens(new types.Range(0, 0, 1, 1), { title: 'Title', command: 'cmd', arguments: [1, true, complexArg] })]; } @@ -616,7 +617,7 @@ suite('ExtHostLanguageFeatureCommands', function () { let resolveCount = 0; - disposables.push(extHost.registerCodeLensProvider(defaultSelector, { + disposables.push(extHost.registerCodeLensProvider(nullExtensionDescription, defaultSelector, { provideCodeLenses(): any { return [ new types.CodeLens(new types.Range(0, 0, 1, 1)), @@ -648,7 +649,7 @@ suite('ExtHostLanguageFeatureCommands', function () { test('Links, back and forth', function () { - disposables.push(extHost.registerDocumentLinkProvider(defaultSelector, { + disposables.push(extHost.registerDocumentLinkProvider(nullExtensionDescription, defaultSelector, { provideDocumentLinks(): any { return [new types.DocumentLink(new types.Range(0, 0, 0, 20), URI.parse('foo:bar'))]; } @@ -671,7 +672,7 @@ suite('ExtHostLanguageFeatureCommands', function () { test('Color provider', function () { - disposables.push(extHost.registerColorProvider(defaultSelector, { + disposables.push(extHost.registerColorProvider(nullExtensionDescription, defaultSelector, { provideDocumentColors(): vscode.ColorInformation[] { return [new types.ColorInformation(new types.Range(0, 0, 0, 20), new types.Color(0.1, 0.2, 0.3, 0.4))]; }, @@ -721,7 +722,7 @@ suite('ExtHostLanguageFeatureCommands', function () { test('"TypeError: e.onCancellationRequested is not a function" calling hover provider in Insiders #54174', function () { - disposables.push(extHost.registerHoverProvider(defaultSelector, { + disposables.push(extHost.registerHoverProvider(nullExtensionDescription, defaultSelector, { provideHover(): any { return new types.Hover('fofofofo'); } diff --git a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts index e75d5d6dfe2..98562920079 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts @@ -44,6 +44,7 @@ import { NullLogService } from 'vs/platform/log/common/log'; import { ITextModel, EndOfLineSequence } from 'vs/editor/common/model'; import { getColors } from 'vs/editor/contrib/colorPicker/color'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { nullExtensionDescription as defaultExtension } from 'vs/workbench/services/extensions/common/extensions'; const defaultSelector = { scheme: 'far' }; const model: ITextModel = EditorModel.createFromString( @@ -132,7 +133,7 @@ suite('ExtHostLanguageFeatures', function () { test('DocumentSymbols, register/deregister', function () { assert.equal(modes.DocumentSymbolProviderRegistry.all(model).length, 0); - let d1 = extHost.registerDocumentSymbolProvider(defaultSelector, { + let d1 = extHost.registerDocumentSymbolProvider(defaultExtension, defaultSelector, { provideDocumentSymbols() { return []; } @@ -147,12 +148,12 @@ suite('ExtHostLanguageFeatures', function () { }); test('DocumentSymbols, evil provider', function () { - disposables.push(extHost.registerDocumentSymbolProvider(defaultSelector, { + disposables.push(extHost.registerDocumentSymbolProvider(defaultExtension, defaultSelector, { provideDocumentSymbols(): any { throw new Error('evil document symbol provider'); } })); - disposables.push(extHost.registerDocumentSymbolProvider(defaultSelector, { + disposables.push(extHost.registerDocumentSymbolProvider(defaultExtension, defaultSelector, { provideDocumentSymbols(): any { return [new types.SymbolInformation('test', types.SymbolKind.Field, new types.Range(0, 0, 0, 0))]; } @@ -167,7 +168,7 @@ suite('ExtHostLanguageFeatures', function () { }); test('DocumentSymbols, data conversion', function () { - disposables.push(extHost.registerDocumentSymbolProvider(defaultSelector, { + disposables.push(extHost.registerDocumentSymbolProvider(defaultExtension, defaultSelector, { provideDocumentSymbols(): any { return [new types.SymbolInformation('test', types.SymbolKind.Field, new types.Range(0, 0, 0, 0))]; } @@ -189,12 +190,12 @@ suite('ExtHostLanguageFeatures', function () { test('CodeLens, evil provider', function () { - disposables.push(extHost.registerCodeLensProvider(defaultSelector, { + disposables.push(extHost.registerCodeLensProvider(defaultExtension, defaultSelector, { provideCodeLenses(): any { throw new Error('evil'); } })); - disposables.push(extHost.registerCodeLensProvider(defaultSelector, { + disposables.push(extHost.registerCodeLensProvider(defaultExtension, defaultSelector, { provideCodeLenses() { return [new types.CodeLens(new types.Range(0, 0, 0, 0))]; } @@ -209,7 +210,7 @@ suite('ExtHostLanguageFeatures', function () { test('CodeLens, do not resolve a resolved lens', function () { - disposables.push(extHost.registerCodeLensProvider(defaultSelector, { + disposables.push(extHost.registerCodeLensProvider(defaultExtension, defaultSelector, { provideCodeLenses(): any { return [new types.CodeLens( new types.Range(0, 0, 0, 0), @@ -235,7 +236,7 @@ suite('ExtHostLanguageFeatures', function () { test('CodeLens, missing command', function () { - disposables.push(extHost.registerCodeLensProvider(defaultSelector, { + disposables.push(extHost.registerCodeLensProvider(defaultExtension, defaultSelector, { provideCodeLenses() { return [new types.CodeLens(new types.Range(0, 0, 0, 0))]; } @@ -260,7 +261,7 @@ suite('ExtHostLanguageFeatures', function () { test('Definition, data conversion', function () { - disposables.push(extHost.registerDefinitionProvider(defaultSelector, { + disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, { provideDefinition(): any { return [new types.Location(model.uri, new types.Range(1, 2, 3, 4))]; } @@ -279,12 +280,12 @@ suite('ExtHostLanguageFeatures', function () { test('Definition, one or many', function () { - disposables.push(extHost.registerDefinitionProvider(defaultSelector, { + disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, { provideDefinition(): any { return [new types.Location(model.uri, new types.Range(1, 1, 1, 1))]; } })); - disposables.push(extHost.registerDefinitionProvider(defaultSelector, { + disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, { provideDefinition(): any { return new types.Location(model.uri, new types.Range(1, 1, 1, 1)); } @@ -300,13 +301,13 @@ suite('ExtHostLanguageFeatures', function () { test('Definition, registration order', function () { - disposables.push(extHost.registerDefinitionProvider(defaultSelector, { + disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, { provideDefinition(): any { return [new types.Location(URI.parse('far://first'), new types.Range(2, 3, 4, 5))]; } })); - disposables.push(extHost.registerDefinitionProvider(defaultSelector, { + disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, { provideDefinition(): any { return new types.Location(URI.parse('far://second'), new types.Range(1, 2, 3, 4)); } @@ -326,12 +327,12 @@ suite('ExtHostLanguageFeatures', function () { test('Definition, evil provider', function () { - disposables.push(extHost.registerDefinitionProvider(defaultSelector, { + disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, { provideDefinition(): any { throw new Error('evil provider'); } })); - disposables.push(extHost.registerDefinitionProvider(defaultSelector, { + disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, { provideDefinition(): any { return new types.Location(model.uri, new types.Range(1, 1, 1, 1)); } @@ -349,7 +350,7 @@ suite('ExtHostLanguageFeatures', function () { test('Implementation, data conversion', function () { - disposables.push(extHost.registerImplementationProvider(defaultSelector, { + disposables.push(extHost.registerImplementationProvider(defaultExtension, defaultSelector, { provideImplementation(): any { return [new types.Location(model.uri, new types.Range(1, 2, 3, 4))]; } @@ -369,7 +370,7 @@ suite('ExtHostLanguageFeatures', function () { test('Type Definition, data conversion', function () { - disposables.push(extHost.registerTypeDefinitionProvider(defaultSelector, { + disposables.push(extHost.registerTypeDefinitionProvider(defaultExtension, defaultSelector, { provideTypeDefinition(): any { return [new types.Location(model.uri, new types.Range(1, 2, 3, 4))]; } @@ -389,7 +390,7 @@ suite('ExtHostLanguageFeatures', function () { test('HoverProvider, word range at pos', function () { - disposables.push(extHost.registerHoverProvider(defaultSelector, { + disposables.push(extHost.registerHoverProvider(defaultExtension, defaultSelector, { provideHover(): any { return new types.Hover('Hello'); } @@ -407,7 +408,7 @@ suite('ExtHostLanguageFeatures', function () { test('HoverProvider, given range', function () { - disposables.push(extHost.registerHoverProvider(defaultSelector, { + disposables.push(extHost.registerHoverProvider(defaultExtension, defaultSelector, { provideHover(): any { return new types.Hover('Hello', new types.Range(3, 0, 8, 7)); } @@ -425,14 +426,14 @@ suite('ExtHostLanguageFeatures', function () { test('HoverProvider, registration order', function () { - disposables.push(extHost.registerHoverProvider(defaultSelector, { + disposables.push(extHost.registerHoverProvider(defaultExtension, defaultSelector, { provideHover(): any { return new types.Hover('registered first'); } })); - disposables.push(extHost.registerHoverProvider(defaultSelector, { + disposables.push(extHost.registerHoverProvider(defaultExtension, defaultSelector, { provideHover(): any { return new types.Hover('registered second'); } @@ -451,12 +452,12 @@ suite('ExtHostLanguageFeatures', function () { test('HoverProvider, evil provider', function () { - disposables.push(extHost.registerHoverProvider(defaultSelector, { + disposables.push(extHost.registerHoverProvider(defaultExtension, defaultSelector, { provideHover(): any { throw new Error('evil'); } })); - disposables.push(extHost.registerHoverProvider(defaultSelector, { + disposables.push(extHost.registerHoverProvider(defaultExtension, defaultSelector, { provideHover(): any { return new types.Hover('Hello'); } @@ -475,7 +476,7 @@ suite('ExtHostLanguageFeatures', function () { test('Occurrences, data conversion', function () { - disposables.push(extHost.registerDocumentHighlightProvider(defaultSelector, { + disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, { provideDocumentHighlights(): any { return [new types.DocumentHighlight(new types.Range(0, 0, 0, 4))]; } @@ -494,12 +495,12 @@ suite('ExtHostLanguageFeatures', function () { test('Occurrences, order 1/2', function () { - disposables.push(extHost.registerDocumentHighlightProvider(defaultSelector, { + disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, { provideDocumentHighlights(): any { return []; } })); - disposables.push(extHost.registerDocumentHighlightProvider('*', { + disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, '*', { provideDocumentHighlights(): any { return [new types.DocumentHighlight(new types.Range(0, 0, 0, 4))]; } @@ -518,12 +519,12 @@ suite('ExtHostLanguageFeatures', function () { test('Occurrences, order 2/2', function () { - disposables.push(extHost.registerDocumentHighlightProvider(defaultSelector, { + disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, { provideDocumentHighlights(): any { return [new types.DocumentHighlight(new types.Range(0, 0, 0, 2))]; } })); - disposables.push(extHost.registerDocumentHighlightProvider('*', { + disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, '*', { provideDocumentHighlights(): any { return [new types.DocumentHighlight(new types.Range(0, 0, 0, 4))]; } @@ -542,13 +543,13 @@ suite('ExtHostLanguageFeatures', function () { test('Occurrences, evil provider', function () { - disposables.push(extHost.registerDocumentHighlightProvider(defaultSelector, { + disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, { provideDocumentHighlights(): any { throw new Error('evil'); } })); - disposables.push(extHost.registerDocumentHighlightProvider(defaultSelector, { + disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, { provideDocumentHighlights(): any { return [new types.DocumentHighlight(new types.Range(0, 0, 0, 4))]; } @@ -566,13 +567,13 @@ suite('ExtHostLanguageFeatures', function () { test('References, registration order', function () { - disposables.push(extHost.registerReferenceProvider(defaultSelector, { + disposables.push(extHost.registerReferenceProvider(defaultExtension, defaultSelector, { provideReferences(): any { return [new types.Location(URI.parse('far://register/first'), new types.Range(0, 0, 0, 0))]; } })); - disposables.push(extHost.registerReferenceProvider(defaultSelector, { + disposables.push(extHost.registerReferenceProvider(defaultExtension, defaultSelector, { provideReferences(): any { return [new types.Location(URI.parse('far://register/second'), new types.Range(0, 0, 0, 0))]; } @@ -592,7 +593,7 @@ suite('ExtHostLanguageFeatures', function () { test('References, data conversion', function () { - disposables.push(extHost.registerReferenceProvider(defaultSelector, { + disposables.push(extHost.registerReferenceProvider(defaultExtension, defaultSelector, { provideReferences(): any { return [new types.Location(model.uri, new types.Position(0, 0))]; } @@ -613,12 +614,12 @@ suite('ExtHostLanguageFeatures', function () { test('References, evil provider', function () { - disposables.push(extHost.registerReferenceProvider(defaultSelector, { + disposables.push(extHost.registerReferenceProvider(defaultExtension, defaultSelector, { provideReferences(): any { throw new Error('evil'); } })); - disposables.push(extHost.registerReferenceProvider(defaultSelector, { + disposables.push(extHost.registerReferenceProvider(defaultExtension, defaultSelector, { provideReferences(): any { return [new types.Location(model.uri, new types.Range(0, 0, 0, 0))]; } @@ -637,7 +638,7 @@ suite('ExtHostLanguageFeatures', function () { test('Quick Fix, command data conversion', function () { - disposables.push(extHost.registerCodeActionProvider(defaultSelector, { + disposables.push(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, { provideCodeActions(): vscode.Command[] { return [ { command: 'test1', title: 'Testing1' }, @@ -661,7 +662,7 @@ suite('ExtHostLanguageFeatures', function () { test('Quick Fix, code action data conversion', function () { - disposables.push(extHost.registerCodeActionProvider(defaultSelector, { + disposables.push(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, { provideCodeActions(): vscode.CodeAction[] { return [ { @@ -689,7 +690,7 @@ suite('ExtHostLanguageFeatures', function () { test('Cannot read property \'id\' of undefined, #29469', function () { - disposables.push(extHost.registerCodeActionProvider(defaultSelector, { + disposables.push(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, { provideCodeActions(): any { return [ undefined, @@ -708,12 +709,12 @@ suite('ExtHostLanguageFeatures', function () { test('Quick Fix, evil provider', function () { - disposables.push(extHost.registerCodeActionProvider(defaultSelector, { + disposables.push(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, { provideCodeActions(): any { throw new Error('evil'); } })); - disposables.push(extHost.registerCodeActionProvider(defaultSelector, { + disposables.push(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, { provideCodeActions(): any { return [{ command: 'test', title: 'Testing' }]; } @@ -730,13 +731,13 @@ suite('ExtHostLanguageFeatures', function () { test('Navigate types, evil provider', function () { - disposables.push(extHost.registerWorkspaceSymbolProvider({ + disposables.push(extHost.registerWorkspaceSymbolProvider(defaultExtension, { provideWorkspaceSymbols(): any { throw new Error('evil'); } })); - disposables.push(extHost.registerWorkspaceSymbolProvider({ + disposables.push(extHost.registerWorkspaceSymbolProvider(defaultExtension, { provideWorkspaceSymbols(): any { return [new types.SymbolInformation('testing', types.SymbolKind.Array, new types.Range(0, 0, 1, 1))]; } @@ -758,7 +759,7 @@ suite('ExtHostLanguageFeatures', function () { test('Rename, evil provider 0/2', function () { - disposables.push(extHost.registerRenameProvider(defaultSelector, { + disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, { provideRenameEdits(): any { throw new class Foo { }; } @@ -776,7 +777,7 @@ suite('ExtHostLanguageFeatures', function () { test('Rename, evil provider 1/2', function () { - disposables.push(extHost.registerRenameProvider(defaultSelector, { + disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, { provideRenameEdits(): any { throw Error('evil'); } @@ -792,13 +793,13 @@ suite('ExtHostLanguageFeatures', function () { test('Rename, evil provider 2/2', function () { - disposables.push(extHost.registerRenameProvider('*', { + disposables.push(extHost.registerRenameProvider(defaultExtension, '*', { provideRenameEdits(): any { throw Error('evil'); } })); - disposables.push(extHost.registerRenameProvider(defaultSelector, { + disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, { provideRenameEdits(): any { let edit = new types.WorkspaceEdit(); edit.replace(model.uri, new types.Range(0, 0, 0, 0), 'testing'); @@ -816,7 +817,7 @@ suite('ExtHostLanguageFeatures', function () { test('Rename, ordering', function () { - disposables.push(extHost.registerRenameProvider('*', { + disposables.push(extHost.registerRenameProvider(defaultExtension, '*', { provideRenameEdits(): any { let edit = new types.WorkspaceEdit(); edit.replace(model.uri, new types.Range(0, 0, 0, 0), 'testing'); @@ -825,7 +826,7 @@ suite('ExtHostLanguageFeatures', function () { } })); - disposables.push(extHost.registerRenameProvider(defaultSelector, { + disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, { provideRenameEdits(): any { return; } @@ -846,13 +847,13 @@ suite('ExtHostLanguageFeatures', function () { test('Parameter Hints, order', function () { - disposables.push(extHost.registerSignatureHelpProvider(defaultSelector, { + disposables.push(extHost.registerSignatureHelpProvider(defaultExtension, defaultSelector, { provideSignatureHelp(): any { return undefined; } }, [])); - disposables.push(extHost.registerSignatureHelpProvider(defaultSelector, { + disposables.push(extHost.registerSignatureHelpProvider(defaultExtension, defaultSelector, { provideSignatureHelp(): vscode.SignatureHelp { return { signatures: [], @@ -871,7 +872,7 @@ suite('ExtHostLanguageFeatures', function () { }); test('Parameter Hints, evil provider', function () { - disposables.push(extHost.registerSignatureHelpProvider(defaultSelector, { + disposables.push(extHost.registerSignatureHelpProvider(defaultExtension, defaultSelector, { provideSignatureHelp(): any { throw new Error('evil'); } @@ -889,13 +890,13 @@ suite('ExtHostLanguageFeatures', function () { test('Suggest, order 1/3', function () { - disposables.push(extHost.registerCompletionItemProvider('*', { + disposables.push(extHost.registerCompletionItemProvider(defaultExtension, '*', { provideCompletionItems(): any { return [new types.CompletionItem('testing1')]; } }, [])); - disposables.push(extHost.registerCompletionItemProvider(defaultSelector, { + disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, { provideCompletionItems(): any { return [new types.CompletionItem('testing2')]; } @@ -911,13 +912,13 @@ suite('ExtHostLanguageFeatures', function () { test('Suggest, order 2/3', function () { - disposables.push(extHost.registerCompletionItemProvider('*', { + disposables.push(extHost.registerCompletionItemProvider(defaultExtension, '*', { provideCompletionItems(): any { return [new types.CompletionItem('weak-selector')]; // weaker selector but result } }, [])); - disposables.push(extHost.registerCompletionItemProvider(defaultSelector, { + disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, { provideCompletionItems(): any { return []; // stronger selector but not a good result; } @@ -933,13 +934,13 @@ suite('ExtHostLanguageFeatures', function () { test('Suggest, order 2/3', function () { - disposables.push(extHost.registerCompletionItemProvider(defaultSelector, { + disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, { provideCompletionItems(): any { return [new types.CompletionItem('strong-1')]; } }, [])); - disposables.push(extHost.registerCompletionItemProvider(defaultSelector, { + disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, { provideCompletionItems(): any { return [new types.CompletionItem('strong-2')]; } @@ -956,13 +957,13 @@ suite('ExtHostLanguageFeatures', function () { test('Suggest, evil provider', function () { - disposables.push(extHost.registerCompletionItemProvider(defaultSelector, { + disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, { provideCompletionItems(): any { throw new Error('evil'); } }, [])); - disposables.push(extHost.registerCompletionItemProvider(defaultSelector, { + disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, { provideCompletionItems(): any { return [new types.CompletionItem('testing')]; } @@ -979,7 +980,7 @@ suite('ExtHostLanguageFeatures', function () { test('Suggest, CompletionList', function () { - disposables.push(extHost.registerCompletionItemProvider(defaultSelector, { + disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, { provideCompletionItems(): any { return new types.CompletionList([new types.CompletionItem('hello')], true); } @@ -996,7 +997,7 @@ suite('ExtHostLanguageFeatures', function () { // --- format test('Format Doc, data conversion', function () { - disposables.push(extHost.registerDocumentFormattingEditProvider(defaultSelector, { + disposables.push(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, { provideDocumentFormattingEdits(): any { return [new types.TextEdit(new types.Range(0, 0, 0, 0), 'testing'), types.TextEdit.setEndOfLine(types.EndOfLine.LF)]; } @@ -1017,7 +1018,7 @@ suite('ExtHostLanguageFeatures', function () { }); test('Format Doc, evil provider', function () { - disposables.push(extHost.registerDocumentFormattingEditProvider(defaultSelector, { + disposables.push(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, { provideDocumentFormattingEdits(): any { throw new Error('evil'); } @@ -1030,19 +1031,19 @@ suite('ExtHostLanguageFeatures', function () { test('Format Doc, order', function () { - disposables.push(extHost.registerDocumentFormattingEditProvider(defaultSelector, { + disposables.push(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, { provideDocumentFormattingEdits(): any { return undefined; } })); - disposables.push(extHost.registerDocumentFormattingEditProvider(defaultSelector, { + disposables.push(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, { provideDocumentFormattingEdits(): any { return [new types.TextEdit(new types.Range(0, 0, 0, 0), 'testing')]; } })); - disposables.push(extHost.registerDocumentFormattingEditProvider(defaultSelector, { + disposables.push(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, { provideDocumentFormattingEdits(): any { return undefined; } @@ -1059,7 +1060,7 @@ suite('ExtHostLanguageFeatures', function () { }); test('Format Range, data conversion', function () { - disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultSelector, { + disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultExtension, defaultSelector, { provideDocumentRangeFormattingEdits(): any { return [new types.TextEdit(new types.Range(0, 0, 0, 0), 'testing')]; } @@ -1076,17 +1077,17 @@ suite('ExtHostLanguageFeatures', function () { }); test('Format Range, + format_doc', function () { - disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultSelector, { + disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultExtension, defaultSelector, { provideDocumentRangeFormattingEdits(): any { return [new types.TextEdit(new types.Range(0, 0, 0, 0), 'range')]; } })); - disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultSelector, { + disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultExtension, defaultSelector, { provideDocumentRangeFormattingEdits(): any { return [new types.TextEdit(new types.Range(2, 3, 4, 5), 'range2')]; } })); - disposables.push(extHost.registerDocumentFormattingEditProvider(defaultSelector, { + disposables.push(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, { provideDocumentFormattingEdits(): any { return [new types.TextEdit(new types.Range(0, 0, 1, 1), 'doc')]; } @@ -1105,7 +1106,7 @@ suite('ExtHostLanguageFeatures', function () { }); test('Format Range, evil provider', function () { - disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultSelector, { + disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultExtension, defaultSelector, { provideDocumentRangeFormattingEdits(): any { throw new Error('evil'); } @@ -1118,7 +1119,7 @@ suite('ExtHostLanguageFeatures', function () { test('Format on Type, data conversion', function () { - disposables.push(extHost.registerOnTypeFormattingEditProvider(defaultSelector, { + disposables.push(extHost.registerOnTypeFormattingEditProvider(defaultExtension, defaultSelector, { provideOnTypeFormattingEdits(): any { return [new types.TextEdit(new types.Range(0, 0, 0, 0), arguments[2])]; } @@ -1137,7 +1138,7 @@ suite('ExtHostLanguageFeatures', function () { test('Links, data conversion', function () { - disposables.push(extHost.registerDocumentLinkProvider(defaultSelector, { + disposables.push(extHost.registerDocumentLinkProvider(defaultExtension, defaultSelector, { provideDocumentLinks() { return [new types.DocumentLink(new types.Range(0, 0, 1, 1), URI.parse('foo:bar#3'))]; } @@ -1156,13 +1157,13 @@ suite('ExtHostLanguageFeatures', function () { test('Links, evil provider', function () { - disposables.push(extHost.registerDocumentLinkProvider(defaultSelector, { + disposables.push(extHost.registerDocumentLinkProvider(defaultExtension, defaultSelector, { provideDocumentLinks() { return [new types.DocumentLink(new types.Range(0, 0, 1, 1), URI.parse('foo:bar#3'))]; } })); - disposables.push(extHost.registerDocumentLinkProvider(defaultSelector, { + disposables.push(extHost.registerDocumentLinkProvider(defaultExtension, defaultSelector, { provideDocumentLinks(): any { throw new Error(); } @@ -1181,7 +1182,7 @@ suite('ExtHostLanguageFeatures', function () { test('Document colors, data conversion', function () { - disposables.push(extHost.registerColorProvider(defaultSelector, { + disposables.push(extHost.registerColorProvider(defaultExtension, defaultSelector, { provideDocumentColors(): vscode.ColorInformation[] { return [new types.ColorInformation(new types.Range(0, 0, 0, 20), new types.Color(0.1, 0.2, 0.3, 0.4))]; }, -- GitLab