Mark list event objects as readonly (#175722)

This marks the objects fired by list/tree events as readonly. This prevents one event from mistakenly effecting other events by modifying the event object
This commit is contained in:
Matt Bierner 2023-03-07 10:54:17 -08:00 committed by GitHub
parent 0393891daf
commit 6c771e3377
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 41 additions and 41 deletions

View File

@ -24,40 +24,40 @@ export interface IListRenderer<T, TTemplateData> {
}
export interface IListEvent<T> {
elements: T[];
indexes: number[];
browserEvent?: UIEvent;
readonly elements: readonly T[];
readonly indexes: readonly number[];
readonly browserEvent?: UIEvent;
}
export interface IListMouseEvent<T> {
browserEvent: MouseEvent;
element: T | undefined;
index: number | undefined;
readonly browserEvent: MouseEvent;
readonly element: T | undefined;
readonly index: number | undefined;
}
export interface IListTouchEvent<T> {
browserEvent: TouchEvent;
element: T | undefined;
index: number | undefined;
readonly browserEvent: TouchEvent;
readonly element: T | undefined;
readonly index: number | undefined;
}
export interface IListGestureEvent<T> {
browserEvent: GestureEvent;
element: T | undefined;
index: number | undefined;
readonly browserEvent: GestureEvent;
readonly element: T | undefined;
readonly index: number | undefined;
}
export interface IListDragEvent<T> {
browserEvent: DragEvent;
element: T | undefined;
index: number | undefined;
readonly browserEvent: DragEvent;
readonly element: T | undefined;
readonly index: number | undefined;
}
export interface IListContextMenuEvent<T> {
browserEvent: UIEvent;
element: T | undefined;
index: number | undefined;
anchor: HTMLElement | { x: number; y: number };
readonly browserEvent: UIEvent;
readonly element: T | undefined;
readonly index: number | undefined;
readonly anchor: HTMLElement | { readonly x: number; readonly y: number };
}
export interface IIdentityProvider<T> {

View File

@ -134,8 +134,8 @@ export interface ITreeRenderer<T, TFilterData = void, TTemplateData = void> exte
}
export interface ITreeEvent<T> {
elements: T[];
browserEvent?: UIEvent;
readonly elements: readonly T[];
readonly browserEvent?: UIEvent;
}
export enum TreeMouseEventTarget {
@ -146,15 +146,15 @@ export enum TreeMouseEventTarget {
}
export interface ITreeMouseEvent<T> {
browserEvent: MouseEvent;
element: T | null;
target: TreeMouseEventTarget;
readonly browserEvent: MouseEvent;
readonly element: T | null;
readonly target: TreeMouseEventTarget;
}
export interface ITreeContextMenuEvent<T> {
browserEvent: UIEvent;
element: T | null;
anchor: HTMLElement | { x: number; y: number };
readonly browserEvent: UIEvent;
readonly element: T | null;
readonly anchor: HTMLElement | { readonly x: number; readonly y: number };
}
export interface ITreeNavigator<T> {

View File

@ -219,8 +219,8 @@ abstract class AbstractTreeView extends Disposable implements ITreeView {
private readonly _onDidCollapseItem: Emitter<ITreeItem> = this._register(new Emitter<ITreeItem>());
readonly onDidCollapseItem: Event<ITreeItem> = this._onDidCollapseItem.event;
private _onDidChangeSelection: Emitter<ITreeItem[]> = this._register(new Emitter<ITreeItem[]>());
readonly onDidChangeSelection: Event<ITreeItem[]> = this._onDidChangeSelection.event;
private _onDidChangeSelection: Emitter<readonly ITreeItem[]> = this._register(new Emitter<readonly ITreeItem[]>());
readonly onDidChangeSelection: Event<readonly ITreeItem[]> = this._onDidChangeSelection.event;
private _onDidChangeFocus: Emitter<ITreeItem> = this._register(new Emitter<ITreeItem>());
readonly onDidChangeFocus: Event<ITreeItem> = this._onDidChangeFocus.event;
@ -240,8 +240,8 @@ abstract class AbstractTreeView extends Disposable implements ITreeView {
private readonly _onDidChangeDescription: Emitter<string | undefined> = this._register(new Emitter<string | undefined>());
readonly onDidChangeDescription: Event<string | undefined> = this._onDidChangeDescription.event;
private readonly _onDidChangeCheckboxState: Emitter<ITreeItem[]> = this._register(new Emitter<ITreeItem[]>());
readonly onDidChangeCheckboxState: Event<ITreeItem[]> = this._onDidChangeCheckboxState.event;
private readonly _onDidChangeCheckboxState: Emitter<readonly ITreeItem[]> = this._register(new Emitter<readonly ITreeItem[]>());
readonly onDidChangeCheckboxState: Event<readonly ITreeItem[]> = this._onDidChangeCheckboxState.event;
private readonly _onDidCompleteRefresh: Emitter<void> = this._register(new Emitter<void>());
@ -856,7 +856,7 @@ abstract class AbstractTreeView extends Disposable implements ITreeView {
return 0;
}
async refresh(elements?: ITreeItem[]): Promise<void> {
async refresh(elements?: readonly ITreeItem[]): Promise<void> {
if (this.dataProvider && this.tree) {
if (this.refreshing) {
await Event.toPromise(this._onDidCompleteRefresh.event);
@ -930,7 +930,7 @@ abstract class AbstractTreeView extends Disposable implements ITreeView {
}
private refreshing: boolean = false;
private async doRefresh(elements: ITreeItem[]): Promise<void> {
private async doRefresh(elements: readonly ITreeItem[]): Promise<void> {
const tree = this.tree;
if (tree && this.visible) {
this.refreshing = true;

View File

@ -665,7 +665,7 @@ export interface ITreeView extends IDisposable {
readonly onDidCollapseItem: Event<ITreeItem>;
readonly onDidChangeSelection: Event<ITreeItem[]>;
readonly onDidChangeSelection: Event<readonly ITreeItem[]>;
readonly onDidChangeFocus: Event<ITreeItem>;
@ -679,11 +679,11 @@ export interface ITreeView extends IDisposable {
readonly onDidChangeWelcomeState: Event<void>;
readonly onDidChangeCheckboxState: Event<ITreeItem[]>;
readonly onDidChangeCheckboxState: Event<readonly ITreeItem[]>;
readonly container: any | undefined;
refresh(treeItems?: ITreeItem[]): Promise<void>;
refresh(treeItems?: readonly ITreeItem[]): Promise<void>;
setVisibility(visible: boolean): void;

View File

@ -609,7 +609,7 @@ export class ExplorerView extends ViewPane implements IExplorerView {
});
}
private onFocusChanged(elements: ExplorerItem[]): void {
private onFocusChanged(elements: readonly ExplorerItem[]): void {
const stat = elements && elements.length ? elements[0] : undefined;
this.setContextKeys(stat);

View File

@ -88,7 +88,7 @@ export class NotebookCellList extends WorkbenchList<CellViewModel> implements ID
get scrollableElement(): HTMLElement {
return this.view.scrollableElementDomNode;
}
private _previousFocusedElements: CellViewModel[] = [];
private _previousFocusedElements: readonly CellViewModel[] = [];
private readonly _localDisposableStore = new DisposableStore();
private readonly _viewModelStore = new DisposableStore();
private styleElement?: HTMLStyleElement;

View File

@ -949,7 +949,7 @@ export class TunnelPanel extends ViewPane {
private onFocusChanged(event: ITableEvent<ITunnelItem>) {
if (event.indexes.length > 0 && event.elements.length > 0) {
this.lastFocus = event.indexes;
this.lastFocus = [...event.indexes];
}
const elements = event.elements;
const item = elements && elements.length ? elements[0] : undefined;

View File

@ -197,7 +197,7 @@ export interface ISCMViewService {
repositories: ISCMRepository[];
readonly onDidChangeRepositories: Event<ISCMViewVisibleRepositoryChangeEvent>;
visibleRepositories: ISCMRepository[];
visibleRepositories: readonly ISCMRepository[];
readonly onDidChangeVisibleRepositories: Event<ISCMViewVisibleRepositoryChangeEvent>;
isVisible(repository: ISCMRepository): boolean;

View File

@ -873,7 +873,7 @@ abstract class UserDataProfileImportExportState extends Disposable implements IT
}
}
onDidChangeCheckboxState(items: ITreeItem[]): ITreeItem[] {
onDidChangeCheckboxState(items: readonly ITreeItem[]): readonly ITreeItem[] {
const toRefresh: ITreeItem[] = [];
for (const item of items) {
if (item.children) {