diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 8a52bcec1bc27fea6738da15629ae6f974afce0d..74c2b921e19e22ef3b9f3b6e3bba10022bb62d39 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -136,6 +136,31 @@ export function createApiFactory( return function (extension: IExtensionDescription): typeof vscode { + // 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 () { + let done = initData.environment.extensionDevelopmentPath !== extension.extensionFolderPath; + function inform(selector: vscode.DocumentSelector) { + console.info(`Extension '${extension.id}' uses a document selector that applies to all schemes.}`); + done = true; + } + return function perform(selector: vscode.DocumentSelector): vscode.DocumentSelector { + if (!done) { + if (Array.isArray(selector)) { + selector.forEach(perform); + } else if (typeof selector === 'string') { + inform(selector); + } else if (typeof selector.scheme === 'undefined') { + inform(selector); + } + } + return selector; + }; + })(); + if (!isFalsyOrEmpty(product.extensionAllowedProposedApi) && product.extensionAllowedProposedApi.indexOf(extension.id) >= 0 ) { @@ -247,61 +272,61 @@ export function createApiFactory( return score(toLanguageSelector(selector), document.uri, document.languageId, true); }, registerCodeActionsProvider(selector: vscode.DocumentSelector, provider: vscode.CodeActionProvider): vscode.Disposable { - return extHostLanguageFeatures.registerCodeActionProvider(selector, provider); + return extHostLanguageFeatures.registerCodeActionProvider(checkSelector(selector), provider); }, registerCodeLensProvider(selector: vscode.DocumentSelector, provider: vscode.CodeLensProvider): vscode.Disposable { - return extHostLanguageFeatures.registerCodeLensProvider(selector, provider); + return extHostLanguageFeatures.registerCodeLensProvider(checkSelector(selector), provider); }, registerDefinitionProvider(selector: vscode.DocumentSelector, provider: vscode.DefinitionProvider): vscode.Disposable { - return extHostLanguageFeatures.registerDefinitionProvider(selector, provider); + return extHostLanguageFeatures.registerDefinitionProvider(checkSelector(selector), provider); }, registerImplementationProvider(selector: vscode.DocumentSelector, provider: vscode.ImplementationProvider): vscode.Disposable { - return extHostLanguageFeatures.registerImplementationProvider(selector, provider); + return extHostLanguageFeatures.registerImplementationProvider(checkSelector(selector), provider); }, registerTypeDefinitionProvider(selector: vscode.DocumentSelector, provider: vscode.TypeDefinitionProvider): vscode.Disposable { - return extHostLanguageFeatures.registerTypeDefinitionProvider(selector, provider); + return extHostLanguageFeatures.registerTypeDefinitionProvider(checkSelector(selector), provider); }, registerHoverProvider(selector: vscode.DocumentSelector, provider: vscode.HoverProvider): vscode.Disposable { - return extHostLanguageFeatures.registerHoverProvider(selector, provider, extension.id); + return extHostLanguageFeatures.registerHoverProvider(checkSelector(selector), provider, extension.id); }, registerDocumentHighlightProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentHighlightProvider): vscode.Disposable { - return extHostLanguageFeatures.registerDocumentHighlightProvider(selector, provider); + return extHostLanguageFeatures.registerDocumentHighlightProvider(checkSelector(selector), provider); }, registerReferenceProvider(selector: vscode.DocumentSelector, provider: vscode.ReferenceProvider): vscode.Disposable { - return extHostLanguageFeatures.registerReferenceProvider(selector, provider); + return extHostLanguageFeatures.registerReferenceProvider(checkSelector(selector), provider); }, registerRenameProvider(selector: vscode.DocumentSelector, provider: vscode.RenameProvider): vscode.Disposable { - return extHostLanguageFeatures.registerRenameProvider(selector, provider, extension.enableProposedApi); + return extHostLanguageFeatures.registerRenameProvider(checkSelector(selector), provider, extension.enableProposedApi); }, registerDocumentSymbolProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentSymbolProvider): vscode.Disposable { - return extHostLanguageFeatures.registerDocumentSymbolProvider(selector, provider); + return extHostLanguageFeatures.registerDocumentSymbolProvider(checkSelector(selector), provider); }, registerWorkspaceSymbolProvider(provider: vscode.WorkspaceSymbolProvider): vscode.Disposable { return extHostLanguageFeatures.registerWorkspaceSymbolProvider(provider); }, registerDocumentFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentFormattingEditProvider): vscode.Disposable { - return extHostLanguageFeatures.registerDocumentFormattingEditProvider(selector, provider); + return extHostLanguageFeatures.registerDocumentFormattingEditProvider(checkSelector(selector), provider); }, registerDocumentRangeFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentRangeFormattingEditProvider): vscode.Disposable { - return extHostLanguageFeatures.registerDocumentRangeFormattingEditProvider(selector, provider); + return extHostLanguageFeatures.registerDocumentRangeFormattingEditProvider(checkSelector(selector), provider); }, registerOnTypeFormattingEditProvider(selector: vscode.DocumentSelector, provider: vscode.OnTypeFormattingEditProvider, firstTriggerCharacter: string, ...moreTriggerCharacters: string[]): vscode.Disposable { - return extHostLanguageFeatures.registerOnTypeFormattingEditProvider(selector, provider, [firstTriggerCharacter].concat(moreTriggerCharacters)); + return extHostLanguageFeatures.registerOnTypeFormattingEditProvider(checkSelector(selector), provider, [firstTriggerCharacter].concat(moreTriggerCharacters)); }, registerSignatureHelpProvider(selector: vscode.DocumentSelector, provider: vscode.SignatureHelpProvider, ...triggerCharacters: string[]): vscode.Disposable { - return extHostLanguageFeatures.registerSignatureHelpProvider(selector, provider, triggerCharacters); + return extHostLanguageFeatures.registerSignatureHelpProvider(checkSelector(selector), provider, triggerCharacters); }, registerCompletionItemProvider(selector: vscode.DocumentSelector, provider: vscode.CompletionItemProvider, ...triggerCharacters: string[]): vscode.Disposable { - return extHostLanguageFeatures.registerCompletionItemProvider(selector, provider, triggerCharacters); + return extHostLanguageFeatures.registerCompletionItemProvider(checkSelector(selector), provider, triggerCharacters); }, registerDocumentLinkProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentLinkProvider): vscode.Disposable { - return extHostLanguageFeatures.registerDocumentLinkProvider(selector, provider); + return extHostLanguageFeatures.registerDocumentLinkProvider(checkSelector(selector), provider); }, registerColorProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentColorProvider): vscode.Disposable { - return extHostLanguageFeatures.registerColorProvider(selector, provider); + return extHostLanguageFeatures.registerColorProvider(checkSelector(selector), provider); }, registerFoldingProvider: proposedApiFunction(extension, (selector: vscode.DocumentSelector, provider: vscode.FoldingProvider): vscode.Disposable => { - return extHostLanguageFeatures.registerFoldingProvider(selector, provider); + return extHostLanguageFeatures.registerFoldingProvider(checkSelector(selector), provider); }), setLanguageConfiguration: (language: string, configuration: vscode.LanguageConfiguration): vscode.Disposable => { return extHostLanguageFeatures.setLanguageConfiguration(language, configuration);