diff --git a/src/vs/base/browser/ui/list/list.ts b/src/vs/base/browser/ui/list/list.ts index a01eeabd060..f828de62d83 100644 --- a/src/vs/base/browser/ui/list/list.ts +++ b/src/vs/base/browser/ui/list/list.ts @@ -36,7 +36,3 @@ export interface IListContextMenuEvent { index: number; anchor: HTMLElement | { x: number; y: number; }; } - -export interface ISpliceable { - splice(start: number, deleteCount: number, elements: T[]): void; -} \ No newline at end of file diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index 0cc6ed66818..ddb2a992425 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -11,10 +11,11 @@ import { domEvent } from 'vs/base/browser/event'; import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { ScrollEvent, ScrollbarVisibility } from 'vs/base/common/scrollable'; import { RangeMap, IRange, relativeComplement } from './rangeMap'; -import { IDelegate, IRenderer, ISpliceable } from './list'; +import { IDelegate, IRenderer } from './list'; import { RowCache, IRow } from './rowCache'; import { isWindows } from 'vs/base/common/platform'; import * as browser from 'vs/base/browser/browser'; +import { ISpliceable } from 'vs/base/common/sequence'; function canUseTranslate3d(): boolean { if (browser.isFirefox) { diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index baade6ee70c..6b6072653ad 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -16,10 +16,11 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import Event, { Emitter, EventBufferer, chain, mapEvent, fromCallback, anyEvent } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; -import { IDelegate, IRenderer, IListEvent, IListMouseEvent, IListContextMenuEvent, ISpliceable } from './list'; +import { IDelegate, IRenderer, IListEvent, IListMouseEvent, IListContextMenuEvent } from './list'; import { ListView, IListViewOptions } from './listView'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; +import { ISpliceable } from 'vs/base/common/sequence'; export interface IIdentityProvider { (element: T): string; diff --git a/src/vs/base/common/arrays.ts b/src/vs/base/common/arrays.ts index 82e7f01acec..8ed0abcd626 100644 --- a/src/vs/base/common/arrays.ts +++ b/src/vs/base/common/arrays.ts @@ -5,6 +5,7 @@ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; +import { ISplice } from 'vs/base/common/sequence'; /** * Returns the last element of an array. @@ -124,20 +125,14 @@ export function groupBy(data: T[], compare: (a: T, b: T) => number): T[][] { return result; } -export interface Splice { - start: number; - deleteCount: number; - inserted: T[]; -} - /** * Diffs two *sorted* arrays and computes the splices which apply the diff. */ -export function sortedDiff(before: T[], after: T[], compare: (a: T, b: T) => number): Splice[] { - const result: Splice[] = []; +export function sortedDiff(before: T[], after: T[], compare: (a: T, b: T) => number): ISplice[] { + const result: ISplice[] = []; - function pushSplice(start: number, deleteCount: number, inserted: T[]): void { - if (deleteCount === 0 && inserted.length === 0) { + function pushSplice(start: number, deleteCount: number, toInsert: T[]): void { + if (deleteCount === 0 && toInsert.length === 0) { return; } @@ -145,9 +140,9 @@ export function sortedDiff(before: T[], after: T[], compare: (a: T, b: T) => if (latest && latest.start + latest.deleteCount === start) { latest.deleteCount += deleteCount; - latest.inserted.push(...inserted); + latest.toInsert.push(...toInsert); } else { - result.push({ start, deleteCount, inserted }); + result.push({ start, deleteCount, toInsert }); } } @@ -199,7 +194,7 @@ export function delta(before: T[], after: T[], compare: (a: T, b: T) => numbe for (const splice of splices) { removed.push(...before.slice(splice.start, splice.start + splice.deleteCount)); - added.push(...splice.inserted); + added.push(...splice.toInsert); } return { removed, added }; diff --git a/src/vs/base/common/sequence.ts b/src/vs/base/common/sequence.ts new file mode 100644 index 00000000000..2aa54d505dd --- /dev/null +++ b/src/vs/base/common/sequence.ts @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +export interface ISplice { + start: number; + deleteCount: number; + toInsert: T[]; +} + +export interface ISpliceable { + splice(start: number, deleteCount: number, toInsert: T[]): void; +} \ No newline at end of file diff --git a/src/vs/workbench/api/node/extHostSCM.ts b/src/vs/workbench/api/node/extHostSCM.ts index 36ae0131eb1..9c3637a8c4c 100644 --- a/src/vs/workbench/api/node/extHostSCM.ts +++ b/src/vs/workbench/api/node/extHostSCM.ts @@ -13,9 +13,10 @@ import { asWinJsPromise } from 'vs/base/common/async'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; import { MainContext, MainThreadSCMShape, SCMRawResource, SCMRawResourceSplice, SCMRawResourceSplices, IMainContext } from './extHost.protocol'; -import { sortedDiff, Splice } from 'vs/base/common/arrays'; +import { sortedDiff } from 'vs/base/common/arrays'; import { comparePaths } from 'vs/base/common/comparers'; import * as vscode from 'vscode'; +import { ISplice } from 'vs/base/common/sequence'; type ProviderHandle = number; type GroupHandle = number; @@ -221,8 +222,8 @@ class ExtHostSourceControlResourceGroup implements vscode.SourceControlResourceG const snapshot = [...this._resourceStates].sort(compareResourceStates); const diffs = sortedDiff(this._resourceSnapshot, snapshot, compareResourceStates); - const splices = diffs.map>(diff => { - const inserted = diff.inserted.map(r => { + const splices = diffs.map>(diff => { + const toInsert = diff.toInsert.map(r => { const handle = this._resourceHandlePool++; this._resourceStatesMap.set(handle, r); @@ -257,16 +258,16 @@ class ExtHostSourceControlResourceGroup implements vscode.SourceControlResourceG return { rawResource, handle }; }); - return { start: diff.start, deleteCount: diff.deleteCount, inserted }; + return { start: diff.start, deleteCount: diff.deleteCount, toInsert }; }); const rawResourceSplices = splices - .map(({ start, deleteCount, inserted }) => [start, deleteCount, inserted.map(i => i.rawResource)] as SCMRawResourceSplice); + .map(({ start, deleteCount, toInsert }) => [start, deleteCount, toInsert.map(i => i.rawResource)] as SCMRawResourceSplice); const reverseSplices = splices.reverse(); - for (const { start, deleteCount, inserted } of reverseSplices) { - const handles = inserted.map(i => i.handle); + for (const { start, deleteCount, toInsert } of reverseSplices) { + const handles = toInsert.map(i => i.handle); const handlesToDelete = this._handlesSnapshot.splice(start, deleteCount, ...handles); for (const handle of handlesToDelete) { diff --git a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts index f103a6b446e..cabe0f7a005 100644 --- a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts @@ -46,9 +46,10 @@ import { basename } from 'vs/base/common/paths'; import { MenuId, IMenuService, IMenu, MenuItemAction } from 'vs/platform/actions/common/actions'; import { fillInActions, MenuItemActionItem } from 'vs/platform/actions/browser/menuItemActionItem'; import { IChange, IEditorModel, ScrollType, IEditorContribution, OverviewRulerLane, IModel } from 'vs/editor/common/editorCommon'; -import { sortedDiff, Splice, firstIndex } from 'vs/base/common/arrays'; +import { sortedDiff, firstIndex } from 'vs/base/common/arrays'; import { IMarginData } from 'vs/editor/browser/controller/mouseTarget'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; +import { ISplice } from 'vs/base/common/sequence'; // TODO@Joao // Need to subclass MenuItemActionItem in order to respect @@ -584,14 +585,14 @@ export class DirtyDiffController implements IEditorContribution { return true; } - private onDidModelChange(splices: Splice[]): void { + private onDidModelChange(splices: ISplice[]): void { for (const splice of splices) { if (splice.start <= this.currentIndex) { if (this.currentIndex < splice.start + splice.deleteCount) { this.currentIndex = -1; this.next(); } else { - this.currentIndex = rot(this.currentIndex + splice.inserted.length - splice.deleteCount - 1, this.model.changes.length); + this.currentIndex = rot(this.currentIndex + splice.toInsert.length - splice.deleteCount - 1, this.model.changes.length); this.next(); } } @@ -849,8 +850,8 @@ export class DirtyDiffModel { private repositoryDisposables = new Set(); private disposables: IDisposable[] = []; - private _onDidChange = new Emitter[]>(); - readonly onDidChange: Event[]> = this._onDidChange.event; + private _onDidChange = new Emitter[]>(); + readonly onDidChange: Event[]> = this._onDidChange.event; private _changes: IChange[] = []; get changes(): IChange[] {