Skip to content

Commit

Permalink
Merge pull request #176056 from microsoft/tyriar/links_contrib__resolver
Browse files Browse the repository at this point in the history
Make resolver service internal to links contrib
  • Loading branch information
Tyriar committed Mar 3, 2023
2 parents 9de99a4 + 48c76f9 commit 83f1dc9
Show file tree
Hide file tree
Showing 10 changed files with 34 additions and 32 deletions.
4 changes: 2 additions & 2 deletions src/vs/workbench/contrib/terminal/browser/terminal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<ITerminalService>('terminalService');
export const ITerminalEditorService = createDecorator<ITerminalEditorService>('terminalEditorService');
Expand All @@ -36,7 +36,7 @@ export const ITerminalInstanceService = createDecorator<ITerminalInstanceService
* been initialized.
*/
export interface ITerminalContribution extends IDisposable {
xtermReady?(xterm: IXtermTerminal): void;
xtermReady?(xterm: IXtermTerminal & { raw: RawXtermTerminal }): void;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,7 @@ export interface ITerminalLinkProviderService {
registerLinkProvider(provider: ITerminalExternalLinkProvider): IDisposable;
}

export const ITerminalLinkResolverService = createDecorator<ITerminalLinkResolverService>('terminalLinkResolverService');
export interface ITerminalLinkResolverService {
readonly _serviceBrand: undefined;
export interface ITerminalLinkResolver {
resolveLink(processManager: Pick<ITerminalProcessManager, 'initialCwd' | 'os' | 'remoteAuthority' | 'userHome'> & { backend?: Pick<ITerminalBackend, 'getWslPath'> }, link: string, uri?: URI): Promise<ResolvedLink>;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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';
Expand All @@ -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,
Expand All @@ -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);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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,
Expand All @@ -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));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -57,7 +57,7 @@ export class TerminalLocalLinkDetector implements ITerminalLinkDetector {
readonly xterm: Terminal,
private readonly _capabilities: ITerminalCapabilityStore,
private readonly _processManager: Pick<ITerminalProcessManager, 'initialCwd' | 'os' | 'remoteAuthority' | 'userHome'> & { backend?: Pick<ITerminalBackend, 'getWslPath'> },
@ITerminalLinkResolverService private readonly _terminalLinkResolverService: ITerminalLinkResolverService,
private readonly _linkResolver: ITerminalLinkResolver,
@IUriIdentityService private readonly _uriIdentityService: IUriIdentityService,
@IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService
) {
Expand Down Expand Up @@ -246,7 +246,7 @@ export class TerminalLocalLinkDetector implements ITerminalLinkDetector {

private async _validateLinkCandidates(linkCandidates: string[]): Promise<ResolvedLink | undefined> {
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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -30,7 +30,7 @@ export class TerminalUriLinkDetector implements ITerminalLinkDetector {
constructor(
readonly xterm: Terminal,
private readonly _processManager: Pick<ITerminalProcessManager, 'initialCwd' | 'os' | 'remoteAuthority' | 'userHome'> & { backend?: Pick<ITerminalBackend, 'getWslPath'> },
@ITerminalLinkResolverService private readonly _terminalLinkResolverService: ITerminalLinkResolverService,
private readonly _linkResolver: ITerminalLinkResolver,
@IUriIdentityService private readonly _uriIdentityService: IUriIdentityService,
@IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService
) {
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<ITerminalConfiguration> = {
fontFamily: 'monospace',
Expand Down Expand Up @@ -90,7 +91,7 @@ suite('TerminalLinkManager', () => {
get<T extends TerminalCapability>(capability: T): ITerminalCapabilityImplMap[T] | undefined {
return undefined;
}
} as Partial<ITerminalCapabilityStore> as any);
} as Partial<ITerminalCapabilityStore> as any, instantiationService.createInstance(TerminalLinkResolver));
});

suite('getLinks and open recent link', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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[];

Expand Down Expand Up @@ -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 });
Expand All @@ -182,7 +183,7 @@ suite('Workbench - TerminalLocalLinkDetector', () => {
remoteAuthority: undefined,
userHome: '/home',
backend: undefined
});
}, resolver);
});

test('should support multiple link results', async () => {
Expand Down Expand Up @@ -219,7 +220,7 @@ suite('Workbench - TerminalLocalLinkDetector', () => {
remoteAuthority: undefined,
userHome: '/home',
backend: undefined
});
}, resolver);
});

for (const l of unixLinks) {
Expand Down Expand Up @@ -268,7 +269,7 @@ suite('Workbench - TerminalLocalLinkDetector', () => {
return original;
},
}
});
}, resolver);
wslUnixToWindowsPathMap.clear();
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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 });
Expand All @@ -44,7 +43,7 @@ suite('Workbench - TerminalUriLinkDetector', () => {
remoteAuthority: undefined,
userHome: '/home',
backend: undefined
});
}, instantiationService.createInstance(TerminalLinkResolver));
});

async function assertLink(
Expand Down

0 comments on commit 83f1dc9

Please sign in to comment.