Skip to content

Commit bbaabb5

Browse files
committed
Make sure getEditorOverrides can return explicitly requested editors
Fixes microsoft#100238 For cases where an extension explicitly requests that a given editor be used, such as `openWith`, `getEditorOverrides` would not always include the requested editor in its returned values. This change fixes that by making `getEditorOverrides` take an optional `id`. Providers can look at this id to determine if they should return a specific editor override even it it does not match the resource
1 parent 669f132 commit bbaabb5

7 files changed

Lines changed: 40 additions & 23 deletions

File tree

src/vs/workbench/browser/contextkeys.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ export class WorkbenchContextKeysHandler extends Disposable {
210210
this.activeEditorContext.set(activeEditorPane.getId());
211211
this.activeEditorIsReadonly.set(activeEditorPane.input.isReadonly());
212212

213-
const editors = activeEditorPane.input.resource ? this.editorService.getEditorOverrides(activeEditorPane.input.resource, undefined, activeGroup) : [];
213+
const editors = activeEditorPane.input.resource ? this.editorService.getEditorOverrides(activeEditorPane.input.resource, undefined, activeGroup, undefined) : [];
214214
this.activeEditorAvailableEditorIds.set(editors.map(([_, entry]) => entry.id).join(','));
215215
} else {
216216
this.activeEditorContext.reset();

src/vs/workbench/browser/parts/editor/editorActions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1836,7 +1836,7 @@ export class ToggleEditorTypeAction extends Action {
18361836
const options = activeEditorPane.options;
18371837
const group = activeEditorPane.group;
18381838

1839-
const overrides = getAllAvailableEditors(input.resource, options, group, this.editorService);
1839+
const overrides = getAllAvailableEditors(input.resource, undefined, options, group, this.editorService);
18401840
const firstNonActiveOverride = overrides.find(([_, entry]) => !entry.active);
18411841
if (!firstNonActiveOverride) {
18421842
return;

src/vs/workbench/contrib/customEditor/browser/customEditors.ts

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -451,29 +451,45 @@ export class CustomEditorContribution extends Disposable implements IWorkbenchCo
451451
open: (editor, options, group) => {
452452
return this.onEditorOpening(editor, options, group);
453453
},
454-
getEditorOverrides: (resource: URI, _options: IEditorOptions | undefined, group: IEditorGroup | undefined): IOpenEditorOverrideEntry[] => {
454+
getEditorOverrides: (resource: URI, _options: IEditorOptions | undefined, group: IEditorGroup | undefined, id: string | undefined): IOpenEditorOverrideEntry[] => {
455455
const currentEditor = group?.editors.find(editor => isEqual(editor.resource, resource));
456456

457+
const defaultEditorOverride: IOpenEditorOverrideEntry = {
458+
...defaultEditorOverrideEntry,
459+
active: this._fileEditorInputFactory.isFileEditorInput(currentEditor),
460+
};
461+
462+
const toOverride = (entry: CustomEditorInfo): IOpenEditorOverrideEntry => {
463+
return {
464+
id: entry.id,
465+
active: currentEditor instanceof CustomEditorInput && currentEditor.viewType === entry.id,
466+
label: entry.displayName,
467+
detail: entry.providerDisplayName,
468+
};
469+
};
470+
471+
if (typeof id === 'string') {
472+
// A specific override was requested. Only return it.
473+
474+
if (id === defaultEditorOverride.id) {
475+
return [defaultEditorOverride];
476+
}
477+
478+
const matchingEditor = this.customEditorService.getCustomEditor(id);
479+
return matchingEditor ? [toOverride(matchingEditor)] : [];
480+
}
481+
482+
// Otherwise, return all potential overrides.
457483
const customEditors = this.customEditorService.getAllCustomEditors(resource);
458484
if (!customEditors.length) {
459485
return [];
460486
}
461487

462488
return [
463-
{
464-
...defaultEditorOverrideEntry,
465-
active: this._fileEditorInputFactory.isFileEditorInput(currentEditor),
466-
},
489+
defaultEditorOverride,
467490
...customEditors.allEditors
468491
.filter(entry => entry.id !== defaultCustomEditor.id)
469-
.map(entry => {
470-
return {
471-
id: entry.id,
472-
active: currentEditor instanceof CustomEditorInput && currentEditor.viewType === entry.id,
473-
label: entry.displayName,
474-
detail: entry.providerDisplayName,
475-
};
476-
})
492+
.map(toOverride)
477493
];
478494
}
479495
}));

src/vs/workbench/contrib/files/browser/views/explorerView.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ export class ExplorerView extends ViewPane {
486486
this.rootContext.set(!stat || (stat && stat.isRoot));
487487

488488
if (resource) {
489-
const overrides = resource ? this.editorService.getEditorOverrides(resource, undefined, undefined) : [];
489+
const overrides = resource ? this.editorService.getEditorOverrides(resource, undefined, undefined, undefined) : [];
490490
this.availableEditorIdsContext.set(overrides.map(([, entry]) => entry.id).join(','));
491491
} else {
492492
this.availableEditorIdsContext.reset();

src/vs/workbench/services/editor/browser/editorService.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -490,10 +490,10 @@ export class EditorService extends Disposable implements EditorServiceImpl {
490490
return toDisposable(() => remove());
491491
}
492492

493-
getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined): [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry][] {
493+
getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined, id: string | undefined): [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry][] {
494494
const overrides = [];
495495
for (const handler of this.openEditorHandlers) {
496-
const handlers = handler.getEditorOverrides ? handler.getEditorOverrides(resource, options, group).map(val => [handler, val] as [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry]) : [];
496+
const handlers = handler.getEditorOverrides ? handler.getEditorOverrides(resource, options, group, id).map(val => [handler, val] as [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry]) : [];
497497
overrides.push(...handlers);
498498
}
499499

@@ -1347,7 +1347,7 @@ export class DelegatingEditorService implements IEditorService {
13471347
isOpen(editor: IEditorInput | IResourceEditorInput): boolean { return this.editorService.isOpen(editor as IResourceEditorInput /* TS fail */); }
13481348

13491349
overrideOpenEditor(handler: IOpenEditorOverrideHandler): IDisposable { return this.editorService.overrideOpenEditor(handler); }
1350-
getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined) { return this.editorService.getEditorOverrides(resource, options, group); }
1350+
getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined, id: string | undefined) { return this.editorService.getEditorOverrides(resource, options, group, id); }
13511351

13521352
invokeWithinEditorContext<T>(fn: (accessor: ServicesAccessor) => T): T { return this.editorService.invokeWithinEditorContext(fn); }
13531353

src/vs/workbench/services/editor/common/editorOpenWith.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export async function openEditorWith(
4242
return;
4343
}
4444

45-
const allEditorOverrides = getAllAvailableEditors(resource, options, group, editorService);
45+
const allEditorOverrides = getAllAvailableEditors(resource, id, options, group, editorService);
4646
if (!allEditorOverrides.length) {
4747
return;
4848
}
@@ -128,12 +128,13 @@ export const defaultEditorOverrideEntry = Object.freeze({
128128
*/
129129
export function getAllAvailableEditors(
130130
resource: URI,
131+
id: string | undefined,
131132
options: IEditorOptions | ITextEditorOptions | undefined,
132133
group: IEditorGroup,
133134
editorService: IEditorService
134135
): Array<[IOpenEditorOverrideHandler, IOpenEditorOverrideEntry]> {
135136
const fileEditorInputFactory = Registry.as<IEditorInputFactoryRegistry>(EditorExtensions.EditorInputFactories).getFileEditorInputFactory();
136-
const overrides = editorService.getEditorOverrides(resource, options, group);
137+
const overrides = editorService.getEditorOverrides(resource, options, group, id);
137138
if (!overrides.some(([_, entry]) => entry.id === DEFAULT_EDITOR_ID)) {
138139
overrides.unshift([
139140
{

src/vs/workbench/services/editor/common/editorService.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export interface IOpenEditorOverrideEntry {
3636

3737
export interface IOpenEditorOverrideHandler {
3838
open(editor: IEditorInput, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup, context: OpenEditorContext): IOpenEditorOverride | undefined;
39-
getEditorOverrides?(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined): IOpenEditorOverrideEntry[];
39+
getEditorOverrides?(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined, id: string | undefined): IOpenEditorOverrideEntry[];
4040
}
4141

4242
export interface IOpenEditorOverride {
@@ -236,7 +236,7 @@ export interface IEditorService {
236236
/**
237237
* Get all available editor overrides for the editor input.
238238
*/
239-
getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined): [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry][];
239+
getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined, id: string | undefined): [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry][];
240240

241241
/**
242242
* Allows to override the opening of editors by installing a handler that will

0 commit comments

Comments
 (0)