mirror of
https://github.com/microsoft/vscode.git
synced 2026-05-08 17:19:48 +01:00
Merge pull request #176056 from microsoft/tyriar/links_contrib__resolver
Make resolver service internal to links contrib
This commit is contained in:
@@ -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');
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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>;
|
||||
}
|
||||
|
||||
|
||||
+7
-5
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
+2
-2
@@ -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
|
||||
@@ -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<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
|
||||
) {
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<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
|
||||
) {
|
||||
@@ -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) {
|
||||
|
||||
+2
-1
@@ -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',
|
||||
@@ -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', () => {
|
||||
|
||||
+7
-6
@@ -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();
|
||||
});
|
||||
|
||||
|
||||
+3
-4
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user