Skip to content

Commit 466999e

Browse files
lramos15aeschli
authored andcommitted
Fix #15178 Finalize tabs API 🎉
1 parent fb8d7bb commit 466999e

File tree

9 files changed

+369
-364
lines changed

9 files changed

+369
-364
lines changed

‎extensions/git/src/repository.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import * as fs from 'fs';
77
import * as path from 'path';
8-
import { CancellationToken, Command, Disposable, Event, EventEmitter, Memento, OutputChannel, ProgressLocation, ProgressOptions, scm, SourceControl, SourceControlInputBox, SourceControlInputBoxValidation, SourceControlInputBoxValidationType, SourceControlResourceDecorations, SourceControlResourceGroup, SourceControlResourceState, ThemeColor, Uri, window, workspace, WorkspaceEdit, FileDecoration, commands, Tab, TabKindTextDiff, TabKindNotebookDiff, RelativePattern } from 'vscode';
8+
import { CancellationToken, Command, Disposable, Event, EventEmitter, Memento, OutputChannel, ProgressLocation, ProgressOptions, scm, SourceControl, SourceControlInputBox, SourceControlInputBoxValidation, SourceControlInputBoxValidationType, SourceControlResourceDecorations, SourceControlResourceGroup, SourceControlResourceState, ThemeColor, Uri, window, workspace, WorkspaceEdit, FileDecoration, commands, Tab, TabInputTextDiff, TabInputNotebookDiff, RelativePattern } from 'vscode';
99
import TelemetryReporter from '@vscode/extension-telemetry';
1010
import * as nls from 'vscode-nls';
1111
import { Branch, Change, ForcePushMode, GitErrorCodes, LogOptions, Ref, RefType, Remote, Status, CommitOptions, BranchQuery, FetchOptions } from './api/git';
@@ -1274,13 +1274,13 @@ export class Repository implements Disposable {
12741274
const diffEditorTabsToClose: Tab[] = [];
12751275

12761276
for (const tab of window.tabGroups.all.map(g => g.tabs).flat()) {
1277-
const { kind } = tab;
1278-
if (kind instanceof TabKindTextDiff || kind instanceof TabKindNotebookDiff) {
1279-
if (kind.modified.scheme === 'git' && indexResources.some(r => pathEquals(r, kind.modified.fsPath))) {
1277+
const { input } = tab;
1278+
if (input instanceof TabInputTextDiff || input instanceof TabInputNotebookDiff) {
1279+
if (input.modified.scheme === 'git' && indexResources.some(r => pathEquals(r, input.modified.fsPath))) {
12801280
// Index
12811281
diffEditorTabsToClose.push(tab);
12821282
}
1283-
if (kind.modified.scheme === 'file' && kind.original.scheme === 'git' && workingTreeResources.some(r => pathEquals(r, kind.modified.fsPath))) {
1283+
if (input.modified.scheme === 'file' && input.original.scheme === 'git' && workingTreeResources.some(r => pathEquals(r, input.modified.fsPath))) {
12841284
// Working Tree
12851285
diffEditorTabsToClose.push(tab);
12861286
}

‎extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import * as assert from 'assert';
77
import { join } from 'path';
8-
import { CancellationTokenSource, commands, MarkdownString, TabKindNotebook, Position, QuickPickItem, Selection, StatusBarAlignment, TabKindTextDiff, TextEditor, TextEditorSelectionChangeKind, TextEditorViewColumnChangeEvent, TabKindText, Uri, ViewColumn, window, workspace } from 'vscode';
8+
import { CancellationTokenSource, commands, MarkdownString, TabInputNotebook, Position, QuickPickItem, Selection, StatusBarAlignment, TextEditor, TextEditorSelectionChangeKind, TextEditorViewColumnChangeEvent, TabInputText, Uri, ViewColumn, window, workspace, TabInputTextDiff } from 'vscode';
99
import { assertNoRpc, closeAllEditors, createRandomFile, pathEquals } from '../utils';
1010

1111

@@ -371,28 +371,28 @@ suite('vscode API - window', () => {
371371
});
372372

373373
//#region Tabs API tests
374-
test('Tabs - move tab', async function () {
375-
const [docA, docB, docC] = await Promise.all([
376-
workspace.openTextDocument(await createRandomFile()),
377-
workspace.openTextDocument(await createRandomFile()),
378-
workspace.openTextDocument(await createRandomFile())
379-
]);
374+
// test('Tabs - move tab', async function () {
375+
// const [docA, docB, docC] = await Promise.all([
376+
// workspace.openTextDocument(await createRandomFile()),
377+
// workspace.openTextDocument(await createRandomFile()),
378+
// workspace.openTextDocument(await createRandomFile())
379+
// ]);
380380

381-
await window.showTextDocument(docA, { viewColumn: ViewColumn.One, preview: false });
382-
await window.showTextDocument(docB, { viewColumn: ViewColumn.One, preview: false });
383-
await window.showTextDocument(docC, { viewColumn: ViewColumn.Two, preview: false });
381+
// await window.showTextDocument(docA, { viewColumn: ViewColumn.One, preview: false });
382+
// await window.showTextDocument(docB, { viewColumn: ViewColumn.One, preview: false });
383+
// await window.showTextDocument(docC, { viewColumn: ViewColumn.Two, preview: false });
384384

385-
const tabGroups = window.tabGroups;
386-
assert.strictEqual(tabGroups.all.length, 2);
385+
// const tabGroups = window.tabGroups;
386+
// assert.strictEqual(tabGroups.all.length, 2);
387387

388-
const group1Tabs = tabGroups.all[0].tabs;
389-
assert.strictEqual(group1Tabs.length, 2);
388+
// const group1Tabs = tabGroups.all[0].tabs;
389+
// assert.strictEqual(group1Tabs.length, 2);
390390

391-
const group2Tabs = tabGroups.all[1].tabs;
392-
assert.strictEqual(group2Tabs.length, 1);
391+
// const group2Tabs = tabGroups.all[1].tabs;
392+
// assert.strictEqual(group2Tabs.length, 1);
393393

394-
await tabGroups.move(group1Tabs[0], ViewColumn.One, 1);
395-
});
394+
// await tabGroups.move(group1Tabs[0], ViewColumn.One, 1);
395+
// });
396396

397397
// TODO @lramos15 re-enable these once shape is more stable
398398
test('Tabs - vscode.open & vscode.diff', async function () {
@@ -423,14 +423,14 @@ suite('vscode API - window', () => {
423423

424424
const tabs = window.tabGroups.all.map(g => g.tabs).flat(1);
425425
assert.strictEqual(tabs.length, 5);
426-
assert.ok(tabs[0].kind instanceof TabKindText);
427-
assert.strictEqual(tabs[0].kind.uri.toString(), docA.uri.toString());
428-
assert.ok(tabs[1].kind instanceof TabKindText);
429-
assert.strictEqual(tabs[1].kind.uri.toString(), docB.uri.toString());
430-
assert.ok(tabs[2].kind instanceof TabKindText);
431-
assert.strictEqual(tabs[2].kind.uri.toString(), docC.uri.toString());
432-
assert.ok(tabs[3].kind instanceof TabKindText);
433-
assert.strictEqual(tabs[3].kind.uri.toString(), commandFile.toString());
426+
assert.ok(tabs[0].input instanceof TabInputText);
427+
assert.strictEqual(tabs[0].input.uri.toString(), docA.uri.toString());
428+
assert.ok(tabs[1].input instanceof TabInputText);
429+
assert.strictEqual(tabs[1].input.uri.toString(), docB.uri.toString());
430+
assert.ok(tabs[2].input instanceof TabInputText);
431+
assert.strictEqual(tabs[2].input.uri.toString(), docC.uri.toString());
432+
assert.ok(tabs[3].input instanceof TabInputText);
433+
assert.strictEqual(tabs[3].input.uri.toString(), commandFile.toString());
434434
});
435435

436436
test('Tabs - Ensure tabs getter is correct', async function () {
@@ -459,17 +459,17 @@ suite('vscode API - window', () => {
459459
assert.strictEqual(tabs.length, 5);
460460

461461
// All resources should match the text documents as they're the only tabs currently open
462-
assert.ok(tabs[0].kind instanceof TabKindText);
463-
assert.strictEqual(tabs[0].kind.uri.toString(), docA.uri.toString());
464-
assert.ok(tabs[1].kind instanceof TabKindNotebook);
465-
assert.strictEqual(tabs[1].kind.uri.toString(), notebookDoc.uri.toString());
466-
assert.ok(tabs[2].kind instanceof TabKindText);
467-
assert.strictEqual(tabs[2].kind.uri.toString(), docB.uri.toString());
468-
assert.ok(tabs[3].kind instanceof TabKindText);
469-
assert.strictEqual(tabs[3].kind.uri.toString(), docC.uri.toString());
462+
assert.ok(tabs[0].input instanceof TabInputText);
463+
assert.strictEqual(tabs[0].input.uri.toString(), docA.uri.toString());
464+
assert.ok(tabs[1].input instanceof TabInputNotebook);
465+
assert.strictEqual(tabs[1].input.uri.toString(), notebookDoc.uri.toString());
466+
assert.ok(tabs[2].input instanceof TabInputText);
467+
assert.strictEqual(tabs[2].input.uri.toString(), docB.uri.toString());
468+
assert.ok(tabs[3].input instanceof TabInputText);
469+
assert.strictEqual(tabs[3].input.uri.toString(), docC.uri.toString());
470470
// Diff editor and side by side editor report the right side as the resource
471-
assert.ok(tabs[4].kind instanceof TabKindTextDiff);
472-
assert.strictEqual(tabs[4].kind.modified.toString(), rightDiff.toString());
471+
assert.ok(tabs[4].input instanceof TabInputTextDiff);
472+
assert.strictEqual(tabs[4].input.modified.toString(), rightDiff.toString());
473473

474474
assert.strictEqual(tabs[0].group.viewColumn, ViewColumn.One);
475475
assert.strictEqual(tabs[1].group.viewColumn, ViewColumn.One);
@@ -495,20 +495,20 @@ suite('vscode API - window', () => {
495495
await window.showTextDocument(docA, { viewColumn: ViewColumn.One, preview: false });
496496
let activeTab = getActiveTabInActiveGroup();
497497
assert.ok(activeTab);
498-
assert.ok(activeTab.kind instanceof TabKindText);
499-
assert.strictEqual(activeTab.kind.uri.toString(), docA.uri.toString());
498+
assert.ok(activeTab.input instanceof TabInputText);
499+
assert.strictEqual(activeTab.input.uri.toString(), docA.uri.toString());
500500

501501
await window.showTextDocument(docB, { viewColumn: ViewColumn.Two, preview: false });
502502
activeTab = getActiveTabInActiveGroup();
503503
assert.ok(activeTab);
504-
assert.ok(activeTab.kind instanceof TabKindText);
505-
assert.strictEqual(activeTab.kind.uri.toString(), docB.uri.toString());
504+
assert.ok(activeTab.input instanceof TabInputText);
505+
assert.strictEqual(activeTab.input.uri.toString(), docB.uri.toString());
506506

507507
await window.showTextDocument(docC, { viewColumn: ViewColumn.Three, preview: false });
508508
activeTab = getActiveTabInActiveGroup();
509509
assert.ok(activeTab);
510-
assert.ok(activeTab.kind instanceof TabKindText);
511-
assert.strictEqual(activeTab.kind.uri.toString(), docC.uri.toString());
510+
assert.ok(activeTab.input instanceof TabInputText);
511+
assert.strictEqual(activeTab.input.uri.toString(), docC.uri.toString());
512512

513513
await commands.executeCommand('workbench.action.closeActiveEditor');
514514
await commands.executeCommand('workbench.action.closeActiveEditor');

‎src/vs/workbench/api/common/extHost.api.impl.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
791791
return extHostUriOpeners.registerExternalUriOpener(extension.identifier, id, opener, metadata);
792792
},
793793
get tabGroups(): vscode.TabGroups {
794-
checkProposedApiEnabled(extension, 'tabs');
795794
return extHostEditorTabs.tabGroups;
796795
},
797796
getInlineCompletionItemController<T extends vscode.InlineCompletionItem>(provider: vscode.InlineCompletionItemProvider<T>): vscode.InlineCompletionController<T> {
@@ -1345,13 +1344,13 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
13451344
LanguageStatusSeverity: extHostTypes.LanguageStatusSeverity,
13461345
QuickPickItemKind: extHostTypes.QuickPickItemKind,
13471346
InputBoxValidationSeverity: extHostTypes.InputBoxValidationSeverity,
1348-
TabKindText: extHostTypes.TextTabInput,
1349-
TabKindTextDiff: extHostTypes.TextDiffTabInput,
1350-
TabKindCustom: extHostTypes.CustomEditorTabInput,
1351-
TabKindNotebook: extHostTypes.NotebookEditorTabInput,
1352-
TabKindNotebookDiff: extHostTypes.NotebookDiffEditorTabInput,
1353-
TabKindWebview: extHostTypes.WebviewEditorTabInput,
1354-
TabKindTerminal: extHostTypes.TerminalEditorTabInput
1347+
TabInputText: extHostTypes.TextTabInput,
1348+
TabInputTextDiff: extHostTypes.TextDiffTabInput,
1349+
TabInputCustom: extHostTypes.CustomEditorTabInput,
1350+
TabInputNotebook: extHostTypes.NotebookEditorTabInput,
1351+
TabInputNotebookDiff: extHostTypes.NotebookDiffEditorTabInput,
1352+
TabInputWebview: extHostTypes.WebviewEditorTabInput,
1353+
TabInputTerminal: extHostTypes.TerminalEditorTabInput
13551354
};
13561355
};
13571356
}

‎src/vs/workbench/api/common/extHostEditorTabs.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { IEditorTabDto, IEditorTabGroupDto, IExtHostEditorTabsShape, MainContext
99
import { URI } from 'vs/base/common/uri';
1010
import { Emitter } from 'vs/base/common/event';
1111
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
12-
import { CustomEditorTabInput, NotebookDiffEditorTabInput, NotebookEditorTabInput, TerminalEditorTabInput, TextDiffTabInput, TextTabInput, ViewColumn, WebviewEditorTabInput } from 'vs/workbench/api/common/extHostTypes';
12+
import { CustomEditorTabInput, NotebookDiffEditorTabInput, NotebookEditorTabInput, TerminalEditorTabInput, TextDiffTabInput, TextTabInput, WebviewEditorTabInput } from 'vs/workbench/api/common/extHostTypes';
1313
import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService';
1414
import { assertIsDefined } from 'vs/base/common/types';
1515
import { diffSets } from 'vs/base/common/collections';
@@ -48,7 +48,7 @@ class ExtHostEditorTab {
4848
get label() {
4949
return that._dto.label;
5050
},
51-
get kind() {
51+
get input() {
5252
return that._input;
5353
},
5454
get isDirty() {
@@ -256,14 +256,14 @@ export class ExtHostEditorTabs implements IExtHostEditorTabs {
256256
return this._closeTabs(tabsOrTabGroups as vscode.Tab[], preserveFocus);
257257
}
258258
},
259-
move: async (tab: vscode.Tab, viewColumn: ViewColumn, index: number, preservceFocus?: boolean) => {
260-
const extHostTab = this._findExtHostTabFromApi(tab);
261-
if (!extHostTab) {
262-
throw new Error('Invalid tab');
263-
}
264-
this._proxy.$moveTab(extHostTab.tabId, index, typeConverters.ViewColumn.from(viewColumn), preservceFocus);
265-
return;
266-
}
259+
// move: async (tab: vscode.Tab, viewColumn: ViewColumn, index: number, preservceFocus?: boolean) => {
260+
// const extHostTab = this._findExtHostTabFromApi(tab);
261+
// if (!extHostTab) {
262+
// throw new Error('Invalid tab');
263+
// }
264+
// this._proxy.$moveTab(extHostTab.tabId, index, typeConverters.ViewColumn.from(viewColumn), preservceFocus);
265+
// return;
266+
// }
267267
};
268268
this._apiObject = Object.freeze(obj);
269269
}

‎src/vs/workbench/api/common/extHostVariableResolverService.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ class ExtHostVariableResolverService extends AbstractVariableResolverService {
5050
const activeTab = editorTabs.tabGroups.all.find(group => group.isActive)?.activeTab;
5151
if (activeTab !== undefined) {
5252
// Resolve a resource from the tab
53-
if (activeTab.kind instanceof TextDiffTabInput || activeTab.kind instanceof NotebookDiffEditorTabInput) {
54-
return activeTab.kind.modified;
55-
} else if (activeTab.kind instanceof TextTabInput || activeTab.kind instanceof NotebookEditorTabInput || activeTab.kind instanceof CustomEditorTabInput) {
56-
return activeTab.kind.uri;
53+
if (activeTab.input instanceof TextDiffTabInput || activeTab.input instanceof NotebookDiffEditorTabInput) {
54+
return activeTab.input.modified;
55+
} else if (activeTab.input instanceof TextTabInput || activeTab.input instanceof NotebookEditorTabInput || activeTab.input instanceof CustomEditorTabInput) {
56+
return activeTab.input.uri;
5757
}
5858
}
5959
}

‎src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -229,10 +229,10 @@ suite('ExtHostEditorTabs', function () {
229229
let all = extHostEditorTabs.tabGroups.all.map(group => group.tabs).flat();
230230
assert.strictEqual(all.length, 1);
231231
const apiTab1 = all[0];
232-
assert.ok(apiTab1.kind instanceof TextTabInput);
232+
assert.ok(apiTab1.input instanceof TextTabInput);
233233
assert.strictEqual(tabDto.input.kind, TabInputKind.TextInput);
234234
const dtoResource = (tabDto.input as TextInputDto).uri;
235-
assert.strictEqual(apiTab1.kind.uri.toString(), URI.revive(dtoResource).toString());
235+
assert.strictEqual(apiTab1.input.uri.toString(), URI.revive(dtoResource).toString());
236236
assert.strictEqual(apiTab1.isDirty, true);
237237

238238

@@ -250,8 +250,8 @@ suite('ExtHostEditorTabs', function () {
250250
all = extHostEditorTabs.tabGroups.all.map(group => group.tabs).flat();
251251
assert.strictEqual(all.length, 1);
252252
const apiTab2 = all[0];
253-
assert.ok(apiTab1.kind instanceof TextTabInput);
254-
assert.strictEqual(apiTab1.kind.uri.toString(), URI.revive(dtoResource).toString());
253+
assert.ok(apiTab1.input instanceof TextTabInput);
254+
assert.strictEqual(apiTab1.input.uri.toString(), URI.revive(dtoResource).toString());
255255
assert.strictEqual(apiTab2.isDirty, false);
256256

257257
assert.strictEqual(apiTab1 === apiTab2, true);
@@ -297,10 +297,10 @@ suite('ExtHostEditorTabs', function () {
297297
assert.strictEqual(all.length, 2);
298298

299299
const activeTab1 = extHostEditorTabs.tabGroups.activeTabGroup?.activeTab;
300-
assert.ok(activeTab1?.kind instanceof TextTabInput);
300+
assert.ok(activeTab1?.input instanceof TextTabInput);
301301
assert.strictEqual(tabDtoAAA.input.kind, TabInputKind.TextInput);
302302
const dtoAAAResource = (tabDtoAAA.input as TextInputDto).uri;
303-
assert.strictEqual(activeTab1?.kind?.uri.toString(), URI.revive(dtoAAAResource)?.toString());
303+
assert.strictEqual(activeTab1?.input?.uri.toString(), URI.revive(dtoAAAResource)?.toString());
304304
assert.strictEqual(activeTab1?.isActive, true);
305305

306306
extHostEditorTabs.$acceptTabOperation({
@@ -311,10 +311,10 @@ suite('ExtHostEditorTabs', function () {
311311
});
312312

313313
const activeTab2 = extHostEditorTabs.tabGroups.activeTabGroup?.activeTab;
314-
assert.ok(activeTab2?.kind instanceof TextTabInput);
314+
assert.ok(activeTab2?.input instanceof TextTabInput);
315315
assert.strictEqual(tabDtoBBB.input.kind, TabInputKind.TextInput);
316316
const dtoBBBResource = (tabDtoBBB.input as TextInputDto).uri;
317-
assert.strictEqual(activeTab2?.kind?.uri.toString(), URI.revive(dtoBBBResource)?.toString());
317+
assert.strictEqual(activeTab2?.input?.uri.toString(), URI.revive(dtoBBBResource)?.toString());
318318
assert.strictEqual(activeTab2?.isActive, true);
319319
assert.strictEqual(activeTab1?.isActive, false);
320320
});

‎src/vs/workbench/services/extensions/common/extensionsApiProposals.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ export const allApiProposals = Object.freeze({
4848
scmActionButton: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmActionButton.d.ts',
4949
scmSelectedProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmSelectedProvider.d.ts',
5050
scmValidation: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmValidation.d.ts',
51-
tabs: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tabs.d.ts',
5251
taskPresentationGroup: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.taskPresentationGroup.d.ts',
5352
telemetry: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.telemetry.d.ts',
5453
terminalDataWriteEvent: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalDataWriteEvent.d.ts',

0 commit comments

Comments
 (0)