Skip to content

Commit aae3357

Browse files
committed
T extends QuickPickItem (#49340)
1 parent ede8a0f commit aae3357

File tree

5 files changed

+46
-46
lines changed

5 files changed

+46
-46
lines changed

src/vs/platform/quickinput/common/quickInput.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ export interface IQuickInput {
109109
dispose(): void;
110110
}
111111

112-
export interface IQuickPick extends IQuickInput {
112+
export interface IQuickPick<T extends IQuickPickItem> extends IQuickInput {
113113

114114
value: string;
115115

@@ -123,21 +123,21 @@ export interface IQuickPick extends IQuickInput {
123123

124124
readonly onDidTriggerButton: Event<IQuickInputButton>;
125125

126-
items: ReadonlyArray<IQuickPickItem>;
126+
items: ReadonlyArray<T>;
127127

128128
canSelectMany: boolean;
129129

130130
matchOnDescription: boolean;
131131

132132
matchOnDetail: boolean;
133133

134-
activeItems: ReadonlyArray<IQuickPickItem>;
134+
activeItems: ReadonlyArray<T>;
135135

136-
readonly onDidChangeActive: Event<IQuickPickItem[]>;
136+
readonly onDidChangeActive: Event<T[]>;
137137

138-
selectedItems: ReadonlyArray<IQuickPickItem>;
138+
selectedItems: ReadonlyArray<T>;
139139

140-
readonly onDidChangeSelection: Event<IQuickPickItem[]>;
140+
readonly onDidChangeSelection: Event<T[]>;
141141
}
142142

143143
export interface IInputBox extends IQuickInput {
@@ -186,7 +186,7 @@ export interface IQuickInputService {
186186

187187
backButton: IQuickInputButton;
188188

189-
createQuickPick(): IQuickPick;
189+
createQuickPick<T extends IQuickPickItem>(): IQuickPick<T>;
190190
createInputBox(): IInputBox;
191191

192192
focus(): void;

src/vs/vscode.proposed.d.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ declare module 'vscode' {
525525

526526
export const quickInputBackButton: QuickInputButton;
527527

528-
export function createQuickPick(): QuickPick;
528+
export function createQuickPick<T extends QuickPickItem>(): QuickPick<T>;
529529

530530
export function createInputBox(): InputBox;
531531
}
@@ -553,7 +553,7 @@ declare module 'vscode' {
553553
dispose(): void;
554554
}
555555

556-
export interface QuickPick extends QuickInput {
556+
export interface QuickPick<T extends QuickPickItem> extends QuickInput {
557557

558558
value: string;
559559

@@ -567,21 +567,21 @@ declare module 'vscode' {
567567

568568
readonly onDidTriggerButton: Event<QuickInputButton>;
569569

570-
items: ReadonlyArray<QuickPickItem>;
570+
items: ReadonlyArray<T>;
571571

572572
canSelectMany: boolean;
573573

574574
matchOnDescription: boolean;
575575

576576
matchOnDetail: boolean;
577577

578-
activeItems: ReadonlyArray<QuickPickItem>;
578+
activeItems: ReadonlyArray<T>;
579579

580-
readonly onDidChangeActive: Event<QuickPickItem[]>;
580+
readonly onDidChangeActive: Event<T[]>;
581581

582-
selectedItems: ReadonlyArray<QuickPickItem>;
582+
selectedItems: ReadonlyArray<T>;
583583

584-
readonly onDidChangeSelection: Event<QuickPickItem[]>;
584+
readonly onDidChangeSelection: Event<T[]>;
585585
}
586586

587587
export interface InputBox extends QuickInput {

src/vs/workbench/api/node/extHost.api.impl.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ export function createApiFactory(
460460
return extHostQuickOpen.backButton;
461461
})();
462462
},
463-
createQuickPick: proposedApiFunction(extension, (): vscode.QuickPick => {
463+
createQuickPick: proposedApiFunction(extension, <T extends vscode.QuickPickItem>(): vscode.QuickPick<T> => {
464464
return extHostQuickOpen.createQuickPick(extension.id);
465465
}),
466466
createInputBox: proposedApiFunction(extension, (): vscode.InputBox => {

src/vs/workbench/api/node/extHostQuickOpen.ts

+12-12
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ export class ExtHostQuickOpen implements ExtHostQuickOpenShape {
155155

156156
backButton = backButton;
157157

158-
createQuickPick(extensionId: string): QuickPick {
158+
createQuickPick<T extends QuickPickItem>(extensionId: string): QuickPick<T> {
159159
const session = new ExtHostQuickPick(this._proxy, extensionId, () => this._sessions.delete(session._id));
160160
this._sessions.set(session._id, session);
161161
return session;
@@ -451,18 +451,18 @@ function getIconUri(iconPath: string | URI) {
451451
return URI.file(iconPath);
452452
}
453453

454-
class ExtHostQuickPick extends ExtHostQuickInput implements QuickPick {
454+
class ExtHostQuickPick<T extends QuickPickItem> extends ExtHostQuickInput implements QuickPick<T> {
455455

456-
private _items: QuickPickItem[] = [];
457-
private _handlesToItems = new Map<number, QuickPickItem>();
458-
private _itemsToHandles = new Map<QuickPickItem, number>();
456+
private _items: T[] = [];
457+
private _handlesToItems = new Map<number, T>();
458+
private _itemsToHandles = new Map<T, number>();
459459
private _canSelectMany = false;
460460
private _matchOnDescription = true;
461461
private _matchOnDetail = true;
462-
private _activeItems: QuickPickItem[] = [];
463-
private _onDidChangeActiveEmitter = new Emitter<QuickPickItem[]>();
464-
private _selectedItems: QuickPickItem[] = [];
465-
private _onDidChangeSelectionEmitter = new Emitter<QuickPickItem[]>();
462+
private _activeItems: T[] = [];
463+
private _onDidChangeActiveEmitter = new Emitter<T[]>();
464+
private _selectedItems: T[] = [];
465+
private _onDidChangeSelectionEmitter = new Emitter<T[]>();
466466

467467
constructor(proxy: MainThreadQuickOpenShape, extensionId: string, onDispose: () => void) {
468468
super(proxy, extensionId, onDispose);
@@ -477,7 +477,7 @@ class ExtHostQuickPick extends ExtHostQuickInput implements QuickPick {
477477
return this._items;
478478
}
479479

480-
set items(items: QuickPickItem[]) {
480+
set items(items: T[]) {
481481
this._items = items.slice();
482482
this._handlesToItems.clear();
483483
this._itemsToHandles.clear();
@@ -527,7 +527,7 @@ class ExtHostQuickPick extends ExtHostQuickInput implements QuickPick {
527527
return this._activeItems;
528528
}
529529

530-
set activeItems(activeItems: QuickPickItem[]) {
530+
set activeItems(activeItems: T[]) {
531531
this._activeItems = activeItems.filter(item => this._itemsToHandles.has(item));
532532
this.update({ activeItems: this._activeItems.map(item => this._itemsToHandles.get(item)) });
533533
}
@@ -538,7 +538,7 @@ class ExtHostQuickPick extends ExtHostQuickInput implements QuickPick {
538538
return this._selectedItems;
539539
}
540540

541-
set selectedItems(selectedItems: QuickPickItem[]) {
541+
set selectedItems(selectedItems: T[]) {
542542
this._selectedItems = selectedItems.filter(item => this._itemsToHandles.has(item));
543543
this.update({ selectedItems: this._selectedItems.map(item => this._itemsToHandles.get(item)) });
544544
}

src/vs/workbench/browser/parts/quickinput/quickInput.ts

+19-19
Original file line numberDiff line numberDiff line change
@@ -276,23 +276,23 @@ class QuickInput implements IQuickInput {
276276
}
277277
}
278278

279-
class QuickPick extends QuickInput implements IQuickPick {
279+
class QuickPick<T extends IQuickPickItem> extends QuickInput implements IQuickPick<T> {
280280

281281
private _value = '';
282282
private _placeholder;
283283
private onDidChangeValueEmitter = new Emitter<string>();
284284
private onDidAcceptEmitter = new Emitter<string>();
285-
private _items: IQuickPickItem[] = [];
285+
private _items: T[] = [];
286286
private itemsUpdated = false;
287287
private _canSelectMany = false;
288288
private _matchOnDescription = true;
289289
private _matchOnDetail = true;
290-
private _activeItems: IQuickPickItem[] = [];
290+
private _activeItems: T[] = [];
291291
private activeItemsUpdated = false;
292-
private onDidChangeActiveEmitter = new Emitter<IQuickPickItem[]>();
293-
private _selectedItems: IQuickPickItem[] = [];
292+
private onDidChangeActiveEmitter = new Emitter<T[]>();
293+
private _selectedItems: T[] = [];
294294
private selectedItemsUpdated = false;
295-
private onDidChangeSelectionEmitter = new Emitter<IQuickPickItem[]>();
295+
private onDidChangeSelectionEmitter = new Emitter<T[]>();
296296
private quickNavigate = false;
297297

298298
constructor(ui: QuickInputUI) {
@@ -331,7 +331,7 @@ class QuickPick extends QuickInput implements IQuickPick {
331331
return this._items;
332332
}
333333

334-
set items(items: IQuickPickItem[]) {
334+
set items(items: T[]) {
335335
this._items = items;
336336
this.itemsUpdated = true;
337337
this.update();
@@ -368,7 +368,7 @@ class QuickPick extends QuickInput implements IQuickPick {
368368
return this._activeItems;
369369
}
370370

371-
set activeItems(activeItems: IQuickPickItem[]) {
371+
set activeItems(activeItems: T[]) {
372372
this._activeItems = activeItems;
373373
this.activeItemsUpdated = true;
374374
this.update();
@@ -380,7 +380,7 @@ class QuickPick extends QuickInput implements IQuickPick {
380380
return this._selectedItems;
381381
}
382382

383-
set selectedItems(selectedItems: IQuickPickItem[]) {
383+
set selectedItems(selectedItems: T[]) {
384384
this._selectedItems = selectedItems;
385385
this.selectedItemsUpdated = true;
386386
this.update();
@@ -433,8 +433,8 @@ class QuickPick extends QuickInput implements IQuickPick {
433433
if (!focusedItems.length && !this._activeItems.length) {
434434
return;
435435
}
436-
this._activeItems = focusedItems;
437-
this.onDidChangeActiveEmitter.fire(focusedItems);
436+
this._activeItems = focusedItems as T[];
437+
this.onDidChangeActiveEmitter.fire(focusedItems as T[]);
438438
}),
439439
this.ui.list.onDidChangeSelection(selectedItems => {
440440
if (this.canSelectMany) {
@@ -444,16 +444,16 @@ class QuickPick extends QuickInput implements IQuickPick {
444444
if (!selectedItems.length && !this._selectedItems.length) {
445445
return;
446446
}
447-
this._selectedItems = selectedItems;
448-
this.onDidChangeSelectionEmitter.fire(selectedItems);
447+
this._selectedItems = selectedItems as T[];
448+
this.onDidChangeSelectionEmitter.fire(selectedItems as T[]);
449449
this.onDidAcceptEmitter.fire();
450450
}),
451451
this.ui.list.onChangedCheckedElements(checkedItems => {
452452
if (!this.canSelectMany) {
453453
return;
454454
}
455-
this._selectedItems = checkedItems;
456-
this.onDidChangeSelectionEmitter.fire(checkedItems);
455+
this._selectedItems = checkedItems as T[];
456+
this.onDidChangeSelectionEmitter.fire(checkedItems as T[]);
457457
}),
458458
);
459459
}
@@ -893,12 +893,12 @@ export class QuickInputService extends Component implements IQuickInputService {
893893
resolve(undefined);
894894
return;
895895
}
896-
const input = this.createQuickPick();
896+
const input = this.createQuickPick<T>();
897897
const disposables = [
898898
input,
899899
input.onDidAccept(() => {
900900
if (input.canSelectMany) {
901-
resolve(<any>input.selectedItems); // TODO: generify interface to use T extends IQuickPickItem
901+
resolve(<any>input.selectedItems.slice());
902902
input.hide();
903903
} else {
904904
const result = input.activeItems[0];
@@ -1005,9 +1005,9 @@ export class QuickInputService extends Component implements IQuickInputService {
10051005

10061006
backButton = backButton;
10071007

1008-
createQuickPick(): IQuickPick {
1008+
createQuickPick<T extends IQuickPickItem>(): IQuickPick<T> {
10091009
this.create();
1010-
return new QuickPick(this.ui);
1010+
return new QuickPick<T>(this.ui);
10111011
}
10121012

10131013
createInputBox(): IInputBox {

0 commit comments

Comments
 (0)