diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index 73845186fa6..b87aba4f629 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -1949,7 +1949,7 @@ export class EditorModeContext extends Disposable { this._register(modes.CodeActionProviderRegistry.onDidChange(update)); this._register(_languageFeaturesService.codeLensProvider.onDidChange(update)); this._register(_languageFeaturesService.definitionProvider.onDidChange(update)); - this._register(modes.DeclarationProviderRegistry.onDidChange(update)); + this._register(_languageFeaturesService.declarationProvider.onDidChange(update)); this._register(modes.ImplementationProviderRegistry.onDidChange(update)); this._register(_languageFeaturesService.typeDefinitionProvider.onDidChange(update)); this._register(modes.HoverProviderRegistry.onDidChange(update)); @@ -2003,7 +2003,7 @@ export class EditorModeContext extends Disposable { this._hasCodeActionsProvider.set(modes.CodeActionProviderRegistry.has(model)); this._hasCodeLensProvider.set(this._languageFeaturesService.codeLensProvider.has(model)); this._hasDefinitionProvider.set(this._languageFeaturesService.definitionProvider.has(model)); - this._hasDeclarationProvider.set(modes.DeclarationProviderRegistry.has(model)); + this._hasDeclarationProvider.set(this._languageFeaturesService.declarationProvider.has(model)); this._hasImplementationProvider.set(modes.ImplementationProviderRegistry.has(model)); this._hasTypeDefinitionProvider.set(this._languageFeaturesService.typeDefinitionProvider.has(model)); this._hasHoverProvider.set(modes.HoverProviderRegistry.has(model)); diff --git a/src/vs/editor/common/languages.ts b/src/vs/editor/common/languages.ts index b5988844ced..4a15df0a190 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 DeclarationProviderRegistry = new LanguageFeatureRegistry(); - /** * @internal */ diff --git a/src/vs/editor/common/services/languageFeatures.ts b/src/vs/editor/common/services/languageFeatures.ts index 49e2ccdd213..83665226db8 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, DefinitionProvider, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, DocumentSymbolProvider, InlayHintsProvider, OnTypeFormattingEditProvider, ReferenceProvider, RenameProvider, TypeDefinitionProvider } from 'vs/editor/common/languages'; +import { CodeLensProvider, DeclarationProvider, DefinitionProvider, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, DocumentSymbolProvider, InlayHintsProvider, OnTypeFormattingEditProvider, ReferenceProvider, RenameProvider, TypeDefinitionProvider } from 'vs/editor/common/languages'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; export const ILanguageFeaturesService = createDecorator('ILanguageFeaturesService'); @@ -19,6 +19,8 @@ export interface ILanguageFeaturesService { readonly typeDefinitionProvider: LanguageFeatureRegistry; + readonly declarationProvider: 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 9f75661c88f..f9e9f18c6e7 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, DefinitionProvider, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, DocumentSymbolProvider, InlayHintsProvider, OnTypeFormattingEditProvider, ReferenceProvider, RenameProvider, TypeDefinitionProvider } from 'vs/editor/common/languages'; +import { CodeLensProvider, DeclarationProvider, DefinitionProvider, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, DocumentSymbolProvider, 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'; @@ -20,6 +20,8 @@ export class LanguageFeatureService implements ILanguageFeaturesService { readonly typeDefinitionProvider = new LanguageFeatureRegistry(); + readonly declarationProvider = 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 fb5e44f00bc..d32efed2d4b 100644 --- a/src/vs/editor/contrib/gotoSymbol/browser/goToCommands.ts +++ b/src/vs/editor/contrib/gotoSymbol/browser/goToCommands.ts @@ -357,7 +357,7 @@ registerGoToAction(class PeekDefinitionAction extends DefinitionAction { class DeclarationAction extends SymbolNavigationAction { protected async _getLocationModel(languageFeaturesService: ILanguageFeaturesService, model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { - return new ReferencesModel(await getDeclarationsAtPosition(model, position, token), nls.localize('decl.title', 'Declarations')); + return new ReferencesModel(await getDeclarationsAtPosition(languageFeaturesService.declarationProvider, model, position, token), nls.localize('decl.title', 'Declarations')); } 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 2351e2964ec..c41007a62d1 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 { DeclarationProviderRegistry, DefinitionProvider, ImplementationProviderRegistry, LocationLink, ProviderResult, ReferenceProvider, TypeDefinitionProvider } from 'vs/editor/common/languages'; +import { DeclarationProvider, DefinitionProvider, ImplementationProviderRegistry, 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'; @@ -48,8 +48,8 @@ export function getDefinitionsAtPosition(registry: LanguageFeatureRegistry { - return getLocationLinks(model, position, DeclarationProviderRegistry, (provider, model, position) => { +export function getDeclarationsAtPosition(registry: LanguageFeatureRegistry, model: ITextModel, position: Position, token: CancellationToken): Promise { + return getLocationLinks(model, position, registry, (provider, model, position) => { return provider.provideDeclaration(model, position, token); }); } @@ -93,16 +93,20 @@ async function _sortedAndDeduped(callback: () => Promise): Promi registerModelAndPositionCommand('_executeDefinitionProvider', (accessor, model, position) => { const languageFeaturesService = accessor.get(ILanguageFeaturesService); const promise = getDefinitionsAtPosition(languageFeaturesService.definitionProvider, model, position, CancellationToken.None); - _sortedAndDeduped(() => promise); + return _sortedAndDeduped(() => promise); }); registerModelAndPositionCommand('_executeTypeDefinitionProvider', (accessor, model, position) => { const languageFeaturesService = accessor.get(ILanguageFeaturesService); const promise = getTypeDefinitionsAtPosition(languageFeaturesService.typeDefinitionProvider, model, position, CancellationToken.None); - _sortedAndDeduped(() => promise); + return _sortedAndDeduped(() => promise); }); -registerModelAndPositionCommand('_executeDeclarationProvider', (_accessor, model, position) => _sortedAndDeduped(() => getDeclarationsAtPosition(model, position, CancellationToken.None))); +registerModelAndPositionCommand('_executeDeclarationProvider', (accessor, model, position) => { + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + const promise = getDeclarationsAtPosition(languageFeaturesService.declarationProvider, model, position, CancellationToken.None); + return _sortedAndDeduped(() => promise); +}); registerModelAndPositionCommand('_executeReferenceProvider', (accessor, model, position) => { const languageFeaturesService = accessor.get(ILanguageFeaturesService); diff --git a/src/vs/editor/standalone/browser/standaloneLanguages.ts b/src/vs/editor/standalone/browser/standaloneLanguages.ts index 5c9e180b333..a3cd65fe7b4 100644 --- a/src/vs/editor/standalone/browser/standaloneLanguages.ts +++ b/src/vs/editor/standalone/browser/standaloneLanguages.ts @@ -582,7 +582,8 @@ export function registerFoldingRangeProvider(languageId: string, provider: langu * Register a declaration provider */ export function registerDeclarationProvider(languageId: string, provider: languages.DeclarationProvider): IDisposable { - return languages.DeclarationProviderRegistry.register(languageId, provider); + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.declarationProvider.register(languageId, provider); } /** diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index bea0654b79d..3e2923f4d73 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -221,7 +221,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha } $registerDeclarationSupport(handle: number, selector: IDocumentFilterDto[]): void { - this._registrations.set(handle, modes.DeclarationProviderRegistry.register(selector, { + this._registrations.set(handle, this._languageFeaturesService.declarationProvider.register(selector, { provideDeclaration: (model, position, token) => { return this._proxy.$provideDeclaration(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 4727c46804d..39db6f759b7 100644 --- a/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts @@ -356,7 +356,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - let value = await getDeclarationsAtPosition(model, new EditorPosition(1, 1), CancellationToken.None); + let value = await getDeclarationsAtPosition(languageFeaturesService.declarationProvider, 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 });