diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index a5fc79634ad..da1810c9f44 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -157,7 +157,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I const extHostTreeViews = rpcProtocol.set(ExtHostContext.ExtHostTreeViews, new ExtHostTreeViews(rpcProtocol.getProxy(MainContext.MainThreadTreeViews), extHostCommands, extHostLogService)); const extHostEditorInsets = rpcProtocol.set(ExtHostContext.ExtHostEditorInsets, new ExtHostEditorInsets(rpcProtocol.getProxy(MainContext.MainThreadEditorInsets), extHostEditors, initData)); const extHostDiagnostics = rpcProtocol.set(ExtHostContext.ExtHostDiagnostics, new ExtHostDiagnostics(rpcProtocol, extHostLogService, extHostFileSystemInfo)); - const extHostLanguages = rpcProtocol.set(ExtHostContext.ExtHostLanguages, new ExtHostLanguages(rpcProtocol, extHostDocuments, extHostCommands.converter)); + const extHostLanguages = rpcProtocol.set(ExtHostContext.ExtHostLanguages, new ExtHostLanguages(rpcProtocol, extHostDocuments, extHostCommands.converter, uriTransformer)); const extHostLanguageFeatures = rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, new ExtHostLanguageFeatures(rpcProtocol, uriTransformer, extHostDocuments, extHostCommands, extHostDiagnostics, extHostLogService, extHostApiDeprecation)); const extHostFileSystem = rpcProtocol.set(ExtHostContext.ExtHostFileSystem, new ExtHostFileSystem(rpcProtocol, extHostLanguageFeatures)); const extHostFileSystemEvent = rpcProtocol.set(ExtHostContext.ExtHostFileSystemEventService, new ExtHostFileSystemEventService(rpcProtocol, extHostLogService, extHostDocumentsAndEditors)); diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index a3575be808e..65e4a91d454 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -17,7 +17,7 @@ import * as extHostProtocol from './extHost.protocol'; import { regExpLeadsToEndlessLoop, regExpFlags } from 'vs/base/common/strings'; import { IPosition } from 'vs/editor/common/core/position'; import { IRange, Range as EditorRange } from 'vs/editor/common/core/range'; -import { isFalsyOrEmpty, isNonEmptyArray, coalesce, asArray } from 'vs/base/common/arrays'; +import { isFalsyOrEmpty, isNonEmptyArray, coalesce } from 'vs/base/common/arrays'; import { isArray, isObject } from 'vs/base/common/types'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; import { ILogService } from 'vs/platform/log/common/log'; @@ -1522,7 +1522,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF private static _handlePool: number = 0; - private readonly _uriTransformer: IURITransformer | null; + private readonly _uriTransformer: IURITransformer; private readonly _proxy: extHostProtocol.MainThreadLanguageFeaturesShape; private _documents: ExtHostDocuments; private _commands: ExtHostCommands; @@ -1533,7 +1533,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF constructor( mainContext: extHostProtocol.IMainContext, - uriTransformer: IURITransformer | null, + uriTransformer: IURITransformer, documents: ExtHostDocuments, commands: ExtHostCommands, diagnostics: ExtHostDiagnostics, @@ -1550,35 +1550,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } private _transformDocumentSelector(selector: vscode.DocumentSelector): Array { - return coalesce(asArray(selector).map(sel => this._doTransformDocumentSelector(sel))); - } - - private _doTransformDocumentSelector(selector: string | vscode.DocumentFilter): extHostProtocol.IDocumentFilterDto | undefined { - if (typeof selector === 'string') { - return { - $serialized: true, - language: selector - }; - } - - if (selector) { - return { - $serialized: true, - language: selector.language, - scheme: this._transformScheme(selector.scheme), - pattern: typeof selector.pattern === 'undefined' ? undefined : typeConvert.GlobPattern.from(selector.pattern), - exclusive: selector.exclusive - }; - } - - return undefined; - } - - private _transformScheme(scheme: string | undefined): string | undefined { - if (this._uriTransformer && typeof scheme === 'string') { - return this._uriTransformer.transformOutgoingScheme(scheme); - } - return scheme; + return typeConvert.DocumentSelector.from(selector, this._uriTransformer); } private _createDisposable(handle: number): Disposable { diff --git a/src/vs/workbench/api/common/extHostLanguages.ts b/src/vs/workbench/api/common/extHostLanguages.ts index 7ccbd9a97dc..6025f37075b 100644 --- a/src/vs/workbench/api/common/extHostLanguages.ts +++ b/src/vs/workbench/api/common/extHostLanguages.ts @@ -13,6 +13,7 @@ import { disposableTimeout } from 'vs/base/common/async'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { CommandsConverter } from 'vs/workbench/api/common/extHostCommands'; +import { IURITransformer } from 'vs/base/common/uriIpc'; export class ExtHostLanguages implements ExtHostLanguagesShape { @@ -23,7 +24,8 @@ export class ExtHostLanguages implements ExtHostLanguagesShape { constructor( mainContext: IMainContext, private readonly _documents: ExtHostDocuments, - private readonly _commands: CommandsConverter + private readonly _commands: CommandsConverter, + private readonly _uriTransformer: IURITransformer | undefined ) { this._proxy = mainContext.getProxy(MainContext.MainThreadLanguages); } @@ -108,7 +110,7 @@ export class ExtHostLanguages implements ExtHostLanguagesShape { id: fullyQualifiedId, name: data.name ?? extension.displayName ?? extension.name, source: extension.displayName ?? extension.name, - selector: data.selector, + selector: typeConvert.DocumentSelector.from(data.selector, this._uriTransformer), label: data.text, detail: data.detail ?? '', severity: data.severity === LanguageStatusSeverity.Error ? Severity.Error : data.severity === LanguageStatusSeverity.Warning ? Severity.Warning : Severity.Info, diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index dfb5840aba9..1b32b078f32 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { coalesce, isNonEmptyArray } from 'vs/base/common/arrays'; +import { asArray, coalesce, isNonEmptyArray } from 'vs/base/common/arrays'; import { VSBuffer } from 'vs/base/common/buffer'; import * as htmlContent from 'vs/base/common/htmlContent'; import { DisposableStore } from 'vs/base/common/lifecycle'; @@ -12,6 +12,7 @@ import { parse } from 'vs/base/common/marshalling'; import { cloneAndChange } from 'vs/base/common/objects'; import { isDefined, isEmptyObject, isNumber, isString } from 'vs/base/common/types'; import { URI, UriComponents } from 'vs/base/common/uri'; +import { IURITransformer } from 'vs/base/common/uriIpc'; import { RenderLineNumbersType } from 'vs/editor/common/config/editorOptions'; import { IPosition } from 'vs/editor/common/core/position'; import * as editorRange from 'vs/editor/common/core/range'; @@ -122,6 +123,41 @@ export namespace Position { } } +export namespace DocumentSelector { + + export function from(value: vscode.DocumentSelector, uriTransformer?: IURITransformer): extHostProtocol.IDocumentFilterDto[] { + return coalesce(asArray(value).map(sel => _doTransformDocumentSelector(sel, uriTransformer))); + } + + function _doTransformDocumentSelector(selector: string | vscode.DocumentFilter, uriTransformer: IURITransformer | undefined): extHostProtocol.IDocumentFilterDto | undefined { + if (typeof selector === 'string') { + return { + $serialized: true, + language: selector + }; + } + + if (selector) { + return { + $serialized: true, + language: selector.language, + scheme: _transformScheme(selector.scheme, uriTransformer), + pattern: typeof selector.pattern === 'undefined' ? undefined : GlobPattern.from(selector.pattern), + exclusive: selector.exclusive + }; + } + + return undefined; + } + + function _transformScheme(scheme: string | undefined, uriTransformer: IURITransformer | undefined): string | undefined { + if (uriTransformer && typeof scheme === 'string') { + return uriTransformer.transformOutgoingScheme(scheme); + } + return scheme; + } +} + export namespace DiagnosticTag { export function from(value: vscode.DiagnosticTag): MarkerTag | undefined { switch (value) { diff --git a/src/vs/workbench/test/browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/browser/api/extHostApiCommands.test.ts index 1bdf51f286b..a96bb2d7776 100644 --- a/src/vs/workbench/test/browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/browser/api/extHostApiCommands.test.ts @@ -51,6 +51,7 @@ import 'vs/editor/contrib/suggest/suggest'; import 'vs/editor/contrib/rename/rename'; import 'vs/editor/contrib/inlayHints/inlayHintsController'; import { IExtHostFileSystemInfo } from 'vs/workbench/api/common/extHostFileSystemInfo'; +import { URITransformerService } from 'vs/workbench/api/common/extHostUriTransformerService'; const defaultSelector = { scheme: 'far' }; const model: ITextModel = createTextModel( @@ -148,7 +149,7 @@ suite('ExtHostLanguageFeatureCommands', function () { const diagnostics = new ExtHostDiagnostics(rpcProtocol, new NullLogService(), new class extends mock() { }); rpcProtocol.set(ExtHostContext.ExtHostDiagnostics, diagnostics); - extHost = new ExtHostLanguageFeatures(rpcProtocol, null, extHostDocuments, commands, diagnostics, new NullLogService(), NullApiDeprecationService); + extHost = new ExtHostLanguageFeatures(rpcProtocol, new URITransformerService(null), extHostDocuments, commands, diagnostics, new NullLogService(), NullApiDeprecationService); rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, extHost); mainThread = rpcProtocol.set(MainContext.MainThreadLanguageFeatures, insta.createInstance(MainThreadLanguageFeatures, rpcProtocol)); diff --git a/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts b/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts index 20b6ba1b858..c9036dbe630 100644 --- a/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts @@ -50,6 +50,7 @@ import { withNullAsUndefined } from 'vs/base/common/types'; import { NullApiDeprecationService } from 'vs/workbench/api/common/extHostApiDeprecationService'; import { Progress } from 'vs/platform/progress/common/progress'; import { IExtHostFileSystemInfo } from 'vs/workbench/api/common/extHostFileSystemInfo'; +import { URITransformerService } from 'vs/workbench/api/common/extHostUriTransformerService'; const defaultSelector = { scheme: 'far' }; const model: ITextModel = createTextModel( @@ -108,7 +109,7 @@ suite('ExtHostLanguageFeatures', function () { const diagnostics = new ExtHostDiagnostics(rpcProtocol, new NullLogService(), new class extends mock() { }); rpcProtocol.set(ExtHostContext.ExtHostDiagnostics, diagnostics); - extHost = new ExtHostLanguageFeatures(rpcProtocol, null, extHostDocuments, commands, diagnostics, new NullLogService(), NullApiDeprecationService); + extHost = new ExtHostLanguageFeatures(rpcProtocol, new URITransformerService(null), extHostDocuments, commands, diagnostics, new NullLogService(), NullApiDeprecationService); rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, extHost); mainThread = rpcProtocol.set(MainContext.MainThreadLanguageFeatures, inst.createInstance(MainThreadLanguageFeatures, rpcProtocol));