From 48c76f991442fce6c7d431508ee065edc16ac7e6 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 3 Mar 2023 07:42:32 -0800 Subject: [PATCH] Make resolver service internal to links contrib It's not needed externally --- .../workbench/contrib/terminal/browser/terminal.ts | 4 ++-- .../contrib/terminalContrib/links/browser/links.ts | 4 +--- .../links/browser/terminal.links.contribution.ts | 12 +++++++----- .../links/browser/terminalLinkManager.ts | 7 ++++--- ...nkResolverService.ts => terminalLinkResolver.ts} | 4 ++-- .../links/browser/terminalLocalLinkDetector.ts | 6 +++--- .../links/browser/terminalUriLinkDetector.ts | 6 +++--- .../links/test/browser/terminalLinkManager.test.ts | 3 ++- .../test/browser/terminalLocalLinkDetector.test.ts | 13 +++++++------ .../test/browser/terminalUriLinkDetector.test.ts | 7 +++---- 10 files changed, 34 insertions(+), 32 deletions(-) rename src/vs/workbench/contrib/terminalContrib/links/browser/{terminalLinkResolverService.ts => terminalLinkResolver.ts} (96%) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 4fe94721b1e..20b93a1b079 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -23,7 +23,7 @@ import { ITerminalQuickFixAddon } from 'vs/workbench/contrib/terminal/browser/xt import { IRegisterContributedProfileArgs, IRemoteTerminalAttachTarget, IStartExtensionTerminalRequest, ITerminalBackend, ITerminalConfigHelper, ITerminalFont, ITerminalProcessExtHostProxy } from 'vs/workbench/contrib/terminal/common/terminal'; import { EditorGroupColumn } from 'vs/workbench/services/editor/common/editorGroupColumn'; import { ISimpleSelectedSuggestion } from 'vs/workbench/services/suggest/browser/simpleSuggestWidget'; -import { IMarker } from 'xterm'; +import { IMarker, Terminal as RawXtermTerminal } from 'xterm'; export const ITerminalService = createDecorator('terminalService'); export const ITerminalEditorService = createDecorator('terminalEditorService'); @@ -36,7 +36,7 @@ export const ITerminalInstanceService = createDecorator('terminalLinkResolverService'); -export interface ITerminalLinkResolverService { - readonly _serviceBrand: undefined; +export interface ITerminalLinkResolver { resolveLink(processManager: Pick & { backend?: Pick }, link: string, uri?: URI): Promise; } diff --git a/src/vs/workbench/contrib/terminalContrib/links/browser/terminal.links.contribution.ts b/src/vs/workbench/contrib/terminalContrib/links/browser/terminal.links.contribution.ts index bcc5c076629..27de4a79c3a 100644 --- a/src/vs/workbench/contrib/terminalContrib/links/browser/terminal.links.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/links/browser/terminal.links.contribution.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { TerminalLinkResolverService } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkResolverService'; -import { ITerminalLinkProviderService, ITerminalLinkResolverService } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; +import { TerminalLinkResolver } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkResolver'; +import { ITerminalLinkProviderService } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { localize } from 'vs/nls'; @@ -22,9 +22,9 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { TerminalLinkQuickpick } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick'; import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/widgets/widgetManager'; import { TerminalLinkProviderService } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkProviderService'; +import { Terminal as RawXtermTerminal } from 'xterm'; registerSingleton(ITerminalLinkProviderService, TerminalLinkProviderService, InstantiationType.Delayed); -registerSingleton(ITerminalLinkResolverService, TerminalLinkResolverService, InstantiationType.Delayed); class TerminalLinkContribution extends DisposableStore implements ITerminalContribution { static readonly ID = 'terminal.link'; @@ -37,6 +37,7 @@ class TerminalLinkContribution extends DisposableStore implements ITerminalContr get linkManager(): TerminalLinkManager | undefined { return this._linkManager; } private _terminalLinkQuickpick: TerminalLinkQuickpick | undefined; + private _linkResolver: TerminalLinkResolver; constructor( private readonly _instance: ITerminalInstance, @@ -46,10 +47,11 @@ class TerminalLinkContribution extends DisposableStore implements ITerminalContr @ITerminalLinkProviderService private readonly _terminalLinkProviderService: ITerminalLinkProviderService ) { super(); + this._linkResolver = this._instantiationService.createInstance(TerminalLinkResolver); } - xtermReady(xterm: IXtermTerminal): void { - const linkManager = this._instantiationService.createInstance(TerminalLinkManager, (xterm as any).raw, this._processManager, this._instance.capabilities); + xtermReady(xterm: IXtermTerminal & { raw: RawXtermTerminal }): void { + const linkManager = this._instantiationService.createInstance(TerminalLinkManager, xterm.raw, this._processManager, this._instance.capabilities, this._linkResolver); this._processManager.onProcessReady(() => { linkManager.setWidgetManager(this._widgetManager); }); diff --git a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkManager.ts b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkManager.ts index d40fdf3836a..1ee0f002831 100644 --- a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkManager.ts +++ b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkManager.ts @@ -13,7 +13,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { ITunnelService } from 'vs/platform/tunnel/common/tunnel'; -import { ITerminalLinkDetector, ITerminalLinkOpener, ITerminalSimpleLink, OmitFirstArg, TerminalBuiltinLinkType, TerminalLinkType } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; +import { ITerminalLinkDetector, ITerminalLinkOpener, ITerminalLinkResolver, ITerminalSimpleLink, OmitFirstArg, TerminalBuiltinLinkType, TerminalLinkType } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; import { TerminalExternalLinkDetector } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalExternalLinkDetector'; import { TerminalLink } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLink'; import { TerminalLinkDetectorAdapter } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkDetectorAdapter'; @@ -50,6 +50,7 @@ export class TerminalLinkManager extends DisposableStore { private readonly _xterm: Terminal, private readonly _processManager: ITerminalProcessManager, capabilities: ITerminalCapabilityStore, + private readonly _linkResolver: ITerminalLinkResolver, @IConfigurationService private readonly _configurationService: IConfigurationService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @ILogService private readonly _logService: ILogService, @@ -70,9 +71,9 @@ export class TerminalLinkManager extends DisposableStore { } // Setup link detectors in their order of priority - this._setupLinkDetector(TerminalUriLinkDetector.id, this._instantiationService.createInstance(TerminalUriLinkDetector, this._xterm, this._processManager)); + this._setupLinkDetector(TerminalUriLinkDetector.id, this._instantiationService.createInstance(TerminalUriLinkDetector, this._xterm, this._processManager, this._linkResolver)); if (enableFileLinks) { - this._setupLinkDetector(TerminalLocalLinkDetector.id, this._instantiationService.createInstance(TerminalLocalLinkDetector, this._xterm, capabilities, this._processManager)); + this._setupLinkDetector(TerminalLocalLinkDetector.id, this._instantiationService.createInstance(TerminalLocalLinkDetector, this._xterm, capabilities, this._processManager, this._linkResolver)); } this._setupLinkDetector(TerminalWordLinkDetector.id, this._instantiationService.createInstance(TerminalWordLinkDetector, this._xterm)); diff --git a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkResolverService.ts b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkResolver.ts similarity index 96% rename from src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkResolverService.ts rename to src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkResolver.ts index 9603320ac15..cc56014e81c 100644 --- a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkResolverService.ts +++ b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkResolver.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ITerminalLinkResolverService, ResolvedLink } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; +import { ITerminalLinkResolver, ResolvedLink } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; import { removeLinkSuffix, winDrivePrefix } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkParsing'; import { URI } from 'vs/base/common/uri'; import { ITerminalBackend, ITerminalProcessManager } from 'vs/workbench/contrib/terminal/common/terminal'; @@ -12,7 +12,7 @@ import { isWindows, OperatingSystem, OS } from 'vs/base/common/platform'; import { IFileService } from 'vs/platform/files/common/files'; import { IPath, posix, win32 } from 'vs/base/common/path'; -export class TerminalLinkResolverService implements ITerminalLinkResolverService { +export class TerminalLinkResolver implements ITerminalLinkResolver { declare _serviceBrand: undefined; // Link cache could be shared across all terminals, but that could lead to weird results when diff --git a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLocalLinkDetector.ts b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLocalLinkDetector.ts index 4a668e07b9a..f8b95e75648 100644 --- a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLocalLinkDetector.ts +++ b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLocalLinkDetector.ts @@ -7,7 +7,7 @@ import { OperatingSystem, OS } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { ITerminalLinkDetector, ITerminalLinkResolverService, ITerminalSimpleLink, ResolvedLink, TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; +import { ITerminalLinkDetector, ITerminalLinkResolver, ITerminalSimpleLink, ResolvedLink, TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; import { convertLinkRangeToBuffer, getXtermLineContent, getXtermRangesByAttr, osPathModule, updateLinkWithRelativeCwd } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkHelpers'; import { ITerminalCapabilityStore, TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities'; import { IBufferLine, IBufferRange, Terminal } from 'xterm'; @@ -57,7 +57,7 @@ export class TerminalLocalLinkDetector implements ITerminalLinkDetector { readonly xterm: Terminal, private readonly _capabilities: ITerminalCapabilityStore, private readonly _processManager: Pick & { backend?: Pick }, - @ITerminalLinkResolverService private readonly _terminalLinkResolverService: ITerminalLinkResolverService, + private readonly _linkResolver: ITerminalLinkResolver, @IUriIdentityService private readonly _uriIdentityService: IUriIdentityService, @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService ) { @@ -246,7 +246,7 @@ export class TerminalLocalLinkDetector implements ITerminalLinkDetector { private async _validateLinkCandidates(linkCandidates: string[]): Promise { for (const link of linkCandidates) { - const result = await this._terminalLinkResolverService.resolveLink(this._processManager, link); + const result = await this._linkResolver.resolveLink(this._processManager, link); if (result) { return result; } diff --git a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalUriLinkDetector.ts b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalUriLinkDetector.ts index 64a35dac031..6af4b9a9f52 100644 --- a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalUriLinkDetector.ts +++ b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalUriLinkDetector.ts @@ -8,7 +8,7 @@ import { URI } from 'vs/base/common/uri'; import { ILinkComputerTarget, LinkComputer } from 'vs/editor/common/languages/linkComputer'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { ITerminalLinkDetector, ITerminalLinkResolverService, ITerminalSimpleLink, TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; +import { ITerminalLinkDetector, ITerminalLinkResolver, ITerminalSimpleLink, TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; import { convertLinkRangeToBuffer, getXtermLineContent } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkHelpers'; import { ITerminalBackend, ITerminalProcessManager } from 'vs/workbench/contrib/terminal/common/terminal'; import { IBufferLine, Terminal } from 'xterm'; @@ -30,7 +30,7 @@ export class TerminalUriLinkDetector implements ITerminalLinkDetector { constructor( readonly xterm: Terminal, private readonly _processManager: Pick & { backend?: Pick }, - @ITerminalLinkResolverService private readonly _terminalLinkResolverService: ITerminalLinkResolverService, + private readonly _linkResolver: ITerminalLinkResolver, @IUriIdentityService private readonly _uriIdentityService: IUriIdentityService, @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService ) { @@ -88,7 +88,7 @@ export class TerminalUriLinkDetector implements ITerminalLinkDetector { // Iterate over all candidates, pushing the candidate on the first that's verified for (const uriCandidate of uriCandidates) { - const linkStat = await this._terminalLinkResolverService.resolveLink(this._processManager, text, uriCandidate); + const linkStat = await this._linkResolver.resolveLink(this._processManager, text, uriCandidate); // Create the link if validated if (linkStat) { diff --git a/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalLinkManager.test.ts b/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalLinkManager.test.ts index d8c1a55b019..2582beaefa6 100644 --- a/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalLinkManager.test.ts +++ b/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalLinkManager.test.ts @@ -22,6 +22,7 @@ import { ITerminalConfiguration, ITerminalProcessManager } from 'vs/workbench/co import { TestViewDescriptorService } from 'vs/workbench/contrib/terminal/test/browser/xterm/xtermTerminal.test'; import { TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; import { ILink, Terminal } from 'xterm'; +import { TerminalLinkResolver } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkResolver'; const defaultTerminalConfig: Partial = { fontFamily: 'monospace', @@ -90,7 +91,7 @@ suite('TerminalLinkManager', () => { get(capability: T): ITerminalCapabilityImplMap[T] | undefined { return undefined; } - } as Partial as any); + } as Partial as any, instantiationService.createInstance(TerminalLinkResolver)); }); suite('getLinks and open recent link', () => { diff --git a/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalLocalLinkDetector.test.ts b/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalLocalLinkDetector.test.ts index 32df534cb80..60788832861 100644 --- a/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalLocalLinkDetector.test.ts +++ b/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalLocalLinkDetector.test.ts @@ -8,14 +8,14 @@ import { format } from 'vs/base/common/strings'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { ITerminalLinkResolverService, TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; +import { TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; import { TerminalLocalLinkDetector } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLocalLinkDetector'; import { TerminalCapabilityStore } from 'vs/platform/terminal/common/capabilities/terminalCapabilityStore'; import { assertLinkHelper } from 'vs/workbench/contrib/terminalContrib/links/test/browser/linkTestUtils'; import { Terminal } from 'xterm'; import { timeout } from 'vs/base/common/async'; import { strictEqual } from 'assert'; -import { TerminalLinkResolverService } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkResolverService'; +import { TerminalLinkResolver } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkResolver'; import { IFileService } from 'vs/platform/files/common/files'; import { createFileStat } from 'vs/workbench/test/common/workbenchTestServices'; import { URI } from 'vs/base/common/uri'; @@ -133,6 +133,7 @@ suite('Workbench - TerminalLocalLinkDetector', () => { let instantiationService: TestInstantiationService; let configurationService: TestConfigurationService; let detector: TerminalLocalLinkDetector; + let resolver: TerminalLinkResolver; let xterm: Terminal; let validResources: URI[]; @@ -168,7 +169,7 @@ suite('Workbench - TerminalLocalLinkDetector', () => { return createFileStat(resource); } }); - instantiationService.set(ITerminalLinkResolverService, instantiationService.createInstance(TerminalLinkResolverService)); + resolver = instantiationService.createInstance(TerminalLinkResolver); validResources = []; xterm = new Terminal({ allowProposedApi: true, cols: 80, rows: 30 }); @@ -182,7 +183,7 @@ suite('Workbench - TerminalLocalLinkDetector', () => { remoteAuthority: undefined, userHome: '/home', backend: undefined - }); + }, resolver); }); test('should support multiple link results', async () => { @@ -219,7 +220,7 @@ suite('Workbench - TerminalLocalLinkDetector', () => { remoteAuthority: undefined, userHome: '/home', backend: undefined - }); + }, resolver); }); for (const l of unixLinks) { @@ -268,7 +269,7 @@ suite('Workbench - TerminalLocalLinkDetector', () => { return original; }, } - }); + }, resolver); wslUnixToWindowsPathMap.clear(); }); diff --git a/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalUriLinkDetector.test.ts b/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalUriLinkDetector.test.ts index 741f54ed0fc..7ef218cd43f 100644 --- a/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalUriLinkDetector.test.ts +++ b/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalUriLinkDetector.test.ts @@ -7,8 +7,8 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { IFileService } from 'vs/platform/files/common/files'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { ITerminalLinkResolverService, TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; -import { TerminalLinkResolverService } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkResolverService'; +import { TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminalContrib/links/browser/links'; +import { TerminalLinkResolver } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkResolver'; import { TerminalUriLinkDetector } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalUriLinkDetector'; import { assertLinkHelper } from 'vs/workbench/contrib/terminalContrib/links/test/browser/linkTestUtils'; import { createFileStat } from 'vs/workbench/test/common/workbenchTestServices'; @@ -34,7 +34,6 @@ suite('Workbench - TerminalUriLinkDetector', () => { return createFileStat(resource); } }); - instantiationService.set(ITerminalLinkResolverService, instantiationService.createInstance(TerminalLinkResolverService)); validResources = []; xterm = new Terminal({ allowProposedApi: true, cols: 80, rows: 30 }); @@ -44,7 +43,7 @@ suite('Workbench - TerminalUriLinkDetector', () => { remoteAuthority: undefined, userHome: '/home', backend: undefined - }); + }, instantiationService.createInstance(TerminalLinkResolver)); }); async function assertLink(