diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index b87aba4f629..7f0f5c0d9ee 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -1950,7 +1950,7 @@ export class EditorModeContext extends Disposable { this._register(_languageFeaturesService.codeLensProvider.onDidChange(update)); this._register(_languageFeaturesService.definitionProvider.onDidChange(update)); this._register(_languageFeaturesService.declarationProvider.onDidChange(update)); - this._register(modes.ImplementationProviderRegistry.onDidChange(update)); + this._register(_languageFeaturesService.implementationProvider.onDidChange(update)); this._register(_languageFeaturesService.typeDefinitionProvider.onDidChange(update)); this._register(modes.HoverProviderRegistry.onDidChange(update)); this._register(modes.DocumentHighlightProviderRegistry.onDidChange(update)); @@ -2004,7 +2004,7 @@ export class EditorModeContext extends Disposable { this._hasCodeLensProvider.set(this._languageFeaturesService.codeLensProvider.has(model)); this._hasDefinitionProvider.set(this._languageFeaturesService.definitionProvider.has(model)); this._hasDeclarationProvider.set(this._languageFeaturesService.declarationProvider.has(model)); - this._hasImplementationProvider.set(modes.ImplementationProviderRegistry.has(model)); + this._hasImplementationProvider.set(this._languageFeaturesService.implementationProvider.has(model)); this._hasTypeDefinitionProvider.set(this._languageFeaturesService.typeDefinitionProvider.has(model)); this._hasHoverProvider.set(modes.HoverProviderRegistry.has(model)); this._hasDocumentHighlightProvider.set(modes.DocumentHighlightProviderRegistry.has(model)); diff --git a/src/vs/editor/common/languages.ts b/src/vs/editor/common/languages.ts index 4a15df0a190..f7712151482 100644 --- a/src/vs/editor/common/languages.ts +++ b/src/vs/editor/common/languages.ts @@ -1927,11 +1927,6 @@ export const DocumentHighlightProviderRegistry = new LanguageFeatureRegistry(); -/** - * @internal - */ -export const ImplementationProviderRegistry = new LanguageFeatureRegistry(); - /** * @internal */ diff --git a/src/vs/editor/common/services/languageFeatures.ts b/src/vs/editor/common/services/languageFeatures.ts index 83665226db8..621a0a86a48 100644 --- a/src/vs/editor/common/services/languageFeatures.ts +++ b/src/vs/editor/common/services/languageFeatures.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; -import { CodeLensProvider, DeclarationProvider, DefinitionProvider, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, DocumentSymbolProvider, InlayHintsProvider, OnTypeFormattingEditProvider, ReferenceProvider, RenameProvider, TypeDefinitionProvider } from 'vs/editor/common/languages'; +import { CodeLensProvider, DeclarationProvider, DefinitionProvider, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, DocumentSymbolProvider, ImplementationProvider, InlayHintsProvider, OnTypeFormattingEditProvider, ReferenceProvider, RenameProvider, TypeDefinitionProvider } from 'vs/editor/common/languages'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; export const ILanguageFeaturesService = createDecorator('ILanguageFeaturesService'); @@ -21,6 +21,8 @@ export interface ILanguageFeaturesService { readonly declarationProvider: LanguageFeatureRegistry; + readonly implementationProvider: LanguageFeatureRegistry; + readonly renameProvider: LanguageFeatureRegistry; readonly documentSymbolProvider: LanguageFeatureRegistry; diff --git a/src/vs/editor/common/services/languageFeaturesService.ts b/src/vs/editor/common/services/languageFeaturesService.ts index f9e9f18c6e7..31b57223c40 100644 --- a/src/vs/editor/common/services/languageFeaturesService.ts +++ b/src/vs/editor/common/services/languageFeaturesService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; -import { CodeLensProvider, DeclarationProvider, DefinitionProvider, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, DocumentSymbolProvider, InlayHintsProvider, OnTypeFormattingEditProvider, ReferenceProvider, RenameProvider, TypeDefinitionProvider } from 'vs/editor/common/languages'; +import { CodeLensProvider, DeclarationProvider, DefinitionProvider, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, DocumentSymbolProvider, ImplementationProvider, InlayHintsProvider, OnTypeFormattingEditProvider, ReferenceProvider, RenameProvider, TypeDefinitionProvider } from 'vs/editor/common/languages'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -22,6 +22,8 @@ export class LanguageFeatureService implements ILanguageFeaturesService { readonly declarationProvider = new LanguageFeatureRegistry(); + readonly implementationProvider = new LanguageFeatureRegistry(); + readonly documentSymbolProvider = new LanguageFeatureRegistry(); readonly inlayHintsProvider = new LanguageFeatureRegistry(); diff --git a/src/vs/editor/contrib/gotoSymbol/browser/goToCommands.ts b/src/vs/editor/contrib/gotoSymbol/browser/goToCommands.ts index d32efed2d4b..d3f99459549 100644 --- a/src/vs/editor/contrib/gotoSymbol/browser/goToCommands.ts +++ b/src/vs/editor/contrib/gotoSymbol/browser/goToCommands.ts @@ -518,7 +518,7 @@ registerGoToAction(class PeekTypeDefinitionAction extends TypeDefinitionAction { class ImplementationAction extends SymbolNavigationAction { protected async _getLocationModel(languageFeaturesService: ILanguageFeaturesService, model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { - return new ReferencesModel(await getImplementationsAtPosition(model, position, token), nls.localize('impl.title', 'Implementations')); + return new ReferencesModel(await getImplementationsAtPosition(languageFeaturesService.implementationProvider, model, position, token), nls.localize('impl.title', 'Implementations')); } protected _getNoResultFoundMessage(info: IWordAtPosition | null): string { diff --git a/src/vs/editor/contrib/gotoSymbol/browser/goToSymbol.ts b/src/vs/editor/contrib/gotoSymbol/browser/goToSymbol.ts index c41007a62d1..ead5381aeba 100644 --- a/src/vs/editor/contrib/gotoSymbol/browser/goToSymbol.ts +++ b/src/vs/editor/contrib/gotoSymbol/browser/goToSymbol.ts @@ -8,7 +8,7 @@ import { onUnexpectedExternalError } from 'vs/base/common/errors'; import { registerModelAndPositionCommand } from 'vs/editor/browser/editorExtensions'; import { Position } from 'vs/editor/common/core/position'; import { ITextModel } from 'vs/editor/common/model'; -import { DeclarationProvider, DefinitionProvider, ImplementationProviderRegistry, LocationLink, ProviderResult, ReferenceProvider, TypeDefinitionProvider } from 'vs/editor/common/languages'; +import { DeclarationProvider, DefinitionProvider, ImplementationProvider, LocationLink, ProviderResult, ReferenceProvider, TypeDefinitionProvider } from 'vs/editor/common/languages'; import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; import { ReferencesModel } from 'vs/editor/contrib/gotoSymbol/browser/referencesModel'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; @@ -54,8 +54,8 @@ export function getDeclarationsAtPosition(registry: LanguageFeatureRegistry { - return getLocationLinks(model, position, ImplementationProviderRegistry, (provider, model, position) => { +export function getImplementationsAtPosition(registry: LanguageFeatureRegistry, model: ITextModel, position: Position, token: CancellationToken): Promise { + return getLocationLinks(model, position, registry, (provider, model, position) => { return provider.provideImplementation(model, position, token); }); } @@ -114,4 +114,8 @@ registerModelAndPositionCommand('_executeReferenceProvider', (accessor, model, p return _sortedAndDeduped(() => promise); }); -registerModelAndPositionCommand('_executeImplementationProvider', (_accessor, model, position) => _sortedAndDeduped(() => getImplementationsAtPosition(model, position, CancellationToken.None))); +registerModelAndPositionCommand('_executeImplementationProvider', (accessor, model, position) => { + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + const promise = getImplementationsAtPosition(languageFeaturesService.implementationProvider, model, position, CancellationToken.None); + _sortedAndDeduped(() => promise); +}); diff --git a/src/vs/editor/standalone/browser/standaloneLanguages.ts b/src/vs/editor/standalone/browser/standaloneLanguages.ts index a3cd65fe7b4..70338e8671f 100644 --- a/src/vs/editor/standalone/browser/standaloneLanguages.ts +++ b/src/vs/editor/standalone/browser/standaloneLanguages.ts @@ -490,7 +490,8 @@ export function registerDefinitionProvider(languageId: string, provider: languag * Register a implementation provider (used by e.g. go to implementation). */ export function registerImplementationProvider(languageId: string, provider: languages.ImplementationProvider): IDisposable { - return languages.ImplementationProviderRegistry.register(languageId, provider); + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.implementationProvider.register(languageId, provider); } /** diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index 3e2923f4d73..a486054cf99 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -229,7 +229,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha } $registerImplementationSupport(handle: number, selector: IDocumentFilterDto[]): void { - this._registrations.set(handle, modes.ImplementationProviderRegistry.register(selector, { + this._registrations.set(handle, this._languageFeaturesService.implementationProvider.register(selector, { provideImplementation: (model, position, token): Promise => { return this._proxy.$provideImplementation(handle, model.uri, position, token).then(MainThreadLanguageFeatures._reviveLocationLinkDto); } diff --git a/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts b/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts index 39db6f759b7..29b686f1ca2 100644 --- a/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts @@ -374,7 +374,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - let value = await getImplementationsAtPosition(model, new EditorPosition(1, 1), CancellationToken.None); + let value = await getImplementationsAtPosition(languageFeaturesService.implementationProvider, model, new EditorPosition(1, 1), CancellationToken.None); assert.strictEqual(value.length, 1); let [entry] = value; assert.deepStrictEqual(entry.range, { startLineNumber: 2, startColumn: 3, endLineNumber: 4, endColumn: 5 });