Skip to content

Commit 9b163c0

Browse files
authored
revive URI for terminal quick fixes (microsoft#167784)
1 parent 9215b37 commit 9b163c0

File tree

5 files changed

+64
-63
lines changed

5 files changed

+64
-63
lines changed

src/vs/platform/terminal/common/xterm/terminalQuickFix.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import { IAction } from 'vs/base/common/actions';
88
import { CancellationToken } from 'vs/base/common/cancellation';
9-
import { UriComponents } from 'vs/base/common/uri';
9+
import { URI } from 'vs/base/common/uri';
1010
import { ITerminalCommand } from 'vs/platform/terminal/common/capabilities/capabilities';
1111

1212
export interface ITerminalCommandSelector {
@@ -39,7 +39,7 @@ export interface ITerminalQuickFixCommandAction extends ITerminalQuickFix {
3939
}
4040
export interface ITerminalQuickFixOpenerAction extends ITerminalQuickFix {
4141
type: 'opener';
42-
uri: UriComponents;
42+
uri: URI;
4343
}
4444

4545
export interface ITerminalCommandSelector {

src/vs/workbench/api/browser/mainThreadTerminalService.ts

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ import { IStartExtensionTerminalRequest, ITerminalProcessExtHostProxy, ITerminal
2020
import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService';
2121
import { withNullAsUndefined } from 'vs/base/common/types';
2222
import { OperatingSystem, OS } from 'vs/base/common/platform';
23-
import { TerminalEditorLocationOptions } from 'vscode';
23+
import { TerminalEditorLocationOptions, TerminalQuickFix, TerminalQuickFixOpenerAction } from 'vscode';
2424
import { Promises } from 'vs/base/common/async';
2525
import { CancellationToken } from 'vs/base/common/cancellation';
2626
import { ITerminalCommand } from 'vs/platform/terminal/common/capabilities/capabilities';
27-
import { ITerminalOutputMatch, ITerminalOutputMatcher, ITerminalQuickFixOptions } from 'vs/platform/terminal/common/xterm/terminalQuickFix';
27+
import { ITerminalOutputMatch, ITerminalOutputMatcher, ITerminalQuickFix, ITerminalQuickFixOptions } from 'vs/platform/terminal/common/xterm/terminalQuickFix';
28+
import { TerminalQuickFixType } from 'vs/workbench/api/common/extHostTypes';
2829

2930
@extHostNamedCustomer(MainContext.MainThreadTerminalService)
3031
export class MainThreadTerminalService implements MainThreadTerminalServiceShape {
@@ -276,19 +277,9 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
276277
if (matchResult) {
277278
const result = await this._proxy.$provideTerminalQuickFixes(id, matchResult, token);
278279
if (result && Array.isArray(result)) {
279-
return result.map(r => {
280-
return {
281-
id,
282-
source: extensionId,
283-
...r
284-
};
285-
});
280+
return result.map(r => parseQuickFix(id, extensionId, r));
286281
} else if (result) {
287-
return {
288-
id,
289-
source: extensionId,
290-
...result
291-
};
282+
return parseQuickFix(id, extensionId, result);
292283
}
293284
}
294285
return;
@@ -468,3 +459,10 @@ export function getOutputMatchForLines(lines: string[], outputMatcher: ITerminal
468459
const match: RegExpMatchArray | null | undefined = lines.join('\n').match(outputMatcher.lineMatcher);
469460
return match ? { regexMatch: match, outputLines: outputMatcher.multipleMatches ? lines : undefined } : undefined;
470461
}
462+
463+
function parseQuickFix(id: string, source: string, fix: TerminalQuickFix): ITerminalQuickFix {
464+
if (fix.type === TerminalQuickFixType.opener) {
465+
(fix as TerminalQuickFixOpenerAction).uri = URI.revive((fix as TerminalQuickFixOpenerAction).uri);
466+
}
467+
return { id, source, ...fix };
468+
}

src/vs/workbench/contrib/terminal/browser/terminalQuickFixBuiltinActions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6+
import { URI } from 'vs/base/common/uri';
67
import { localize } from 'vs/nls';
78
import { IInternalOptions, ITerminalCommandMatchResult, TerminalQuickFixActionInternal } from 'vs/platform/terminal/common/xterm/terminalQuickFix';
89
import { ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal';
@@ -184,7 +185,7 @@ export function gitCreatePr(): IInternalOptions {
184185
label,
185186
enabled: true,
186187
type: 'opener',
187-
uri: link,
188+
uri: URI.parse(link),
188189
run: () => { }
189190
};
190191
}

src/vs/workbench/contrib/terminal/browser/xterm/quickFixAddon.ts

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ import { ITerminalQuickFixProviderSelector, ITerminalQuickFixService } from 'vs/
2929
import { ITerminalQuickFixOptions, IResolvedExtensionOptions, IUnresolvedExtensionOptions, ITerminalCommandSelector, ITerminalQuickFix, IInternalOptions, ITerminalQuickFixCommandAction, ITerminalQuickFixOpenerAction } from 'vs/platform/terminal/common/xterm/terminalQuickFix';
3030
import { getLinesForCommand } from 'vs/platform/terminal/common/capabilities/commandDetectionCapability';
3131
import { IAnchor } from 'vs/base/browser/ui/contextview/contextview';
32-
import { URI } from 'vs/base/common/uri';
32+
import { ILabelService } from 'vs/platform/label/common/label';
33+
import { Schemas } from 'vs/base/common/network';
3334

3435
const quickFixTelemetryTitle = 'terminal/quick-fix';
3536
type QuickFixResultTelemetryEvent = {
@@ -81,7 +82,8 @@ export class TerminalQuickFixAddon extends Disposable implements ITerminalAddon,
8182
@ILogService private readonly _logService: ILogService,
8283
@IExtensionService private readonly _extensionService: IExtensionService,
8384
@ITerminalContributionService private readonly _terminalContributionService: ITerminalContributionService,
84-
@IActionWidgetService private readonly _actionWidgetService: IActionWidgetService
85+
@IActionWidgetService private readonly _actionWidgetService: IActionWidgetService,
86+
@ILabelService private readonly _labelService: ILabelService
8587
) {
8688
super();
8789
const commandDetectionCapability = this._capabilities.get(TerminalCapability.CommandDetection);
@@ -195,7 +197,7 @@ export class TerminalQuickFixAddon extends Disposable implements ITerminalAddon,
195197
}
196198
return provider.provideTerminalQuickFixes(command, lines, { type: 'resolved', commandLineMatcher: selector.commandLineMatcher, outputMatcher: selector.outputMatcher, exitStatus: selector.exitStatus, id: selector.id }, new CancellationTokenSource().token);
197199
};
198-
const result = await getQuickFixesForCommand(aliases, terminal, command, this._commandListeners, this._openerService, this._onDidRequestRerunCommand, resolver);
200+
const result = await getQuickFixesForCommand(aliases, terminal, command, this._commandListeners, this._openerService, this._labelService, this._onDidRequestRerunCommand, resolver);
199201
if (!result) {
200202
return;
201203
}
@@ -280,6 +282,7 @@ export async function getQuickFixesForCommand(
280282
terminalCommand: ITerminalCommand,
281283
quickFixOptions: Map<string, ITerminalQuickFixOptions[]>,
282284
openerService: IOpenerService,
285+
labelService: ILabelService,
283286
onDidRequestRerunCommand?: Emitter<{ command: string; addNewLine?: boolean }>,
284287
getResolvedFixes?: (selector: ITerminalQuickFixOptions, lines?: string[]) => Promise<ITerminalQuickFix | ITerminalQuickFix[] | undefined>
285288
): Promise<ITerminalAction[] | undefined> {
@@ -344,26 +347,18 @@ export async function getQuickFixesForCommand(
344347
}
345348
case TerminalQuickFixType.Opener: {
346349
const fix = quickFix as ITerminalQuickFixOpenerAction;
347-
const label = localize('quickFix.opener', 'Open: {0}', fix.uri.toString());
350+
if (!fix.uri) {
351+
return;
352+
}
353+
const uriLabel = (fix.uri.scheme === Schemas.http || fix.uri.scheme === Schemas.https) ? encodeURI(fix.uri.toString(true)) : labelService.getUriLabel(fix.uri);
354+
const label = localize('quickFix.opener', 'Open: {0}', uriLabel);
348355
action = {
349356
source: quickFix.source,
350357
id: quickFix.id,
351358
label,
352359
class: quickFix.type,
353360
enabled: true,
354-
run: () => {
355-
let uri: URI | undefined;
356-
if (URI.isUri(fix.uri)) {
357-
uri = fix.uri;
358-
} else if (typeof fix.uri === 'string') {
359-
uri = URI.parse(fix.uri);
360-
}
361-
362-
if (!uri) {
363-
return;
364-
}
365-
openerService.open(uri);
366-
},
361+
run: () => openerService.open(fix.uri),
367362
tooltip: label,
368363
uri: fix.uri
369364
} as ITerminalAction;

0 commit comments

Comments
 (0)