From e1869c57850291a04777d85ab94225133dca86af Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 5 May 2020 12:34:10 +0200 Subject: [PATCH] make ResourceMap a real ES6 map, #93368 fyi @bpasero --- src/vs/base/common/map.ts | 46 +++++++++++++------ src/vs/base/test/common/map.test.ts | 9 ++-- .../common/configurationModels.ts | 2 +- .../contrib/markers/browser/markers.ts | 2 +- .../notebook/common/notebookEditorModel.ts | 2 +- .../contrib/search/common/searchModel.ts | 6 +-- .../backup/common/backupFileService.ts | 2 +- .../services/bulkEdit/browser/conflicts.ts | 2 +- .../services/editor/browser/editorService.ts | 2 +- .../services/search/common/searchService.ts | 4 +- .../common/textFileEditorModelManager.ts | 2 +- 11 files changed, 49 insertions(+), 30 deletions(-) diff --git a/src/vs/base/common/map.ts b/src/vs/base/common/map.ts index a7a67253af895..5d79ad368a744 100644 --- a/src/vs/base/common/map.ts +++ b/src/vs/base/common/map.ts @@ -481,7 +481,9 @@ export class TernarySearchTree { } } -export class ResourceMap { +export class ResourceMap implements Map { + + readonly [Symbol.toStringTag] = 'ResourceMap'; protected readonly map: Map; protected readonly ignoreCase?: boolean; @@ -491,8 +493,9 @@ export class ResourceMap { this.ignoreCase = false; // in the future this should be an uri-comparator } - set(resource: URI, value: T): void { + set(resource: URI, value: T): this { this.map.set(this.toKey(resource), value); + return this; } get(resource: URI): T | undefined { @@ -515,33 +518,46 @@ export class ResourceMap { return this.map.delete(this.toKey(resource)); } - forEach(clb: (value: T, key: URI) => void): void { - this.map.forEach((value, index) => clb(value, URI.parse(index))); + forEach(clb: (value: T, key: URI, map: Map) => void, thisArg?: any): void { + if (typeof thisArg !== 'undefined') { + clb = clb.bind(thisArg); + } + for (let [index, value] of this.map) { + clb(value, URI.parse(index), this); + } } - values(): T[] { - return values(this.map); + values(): IterableIterator { + return this.map.values(); } - private toKey(resource: URI): string { - let key = resource.toString(); - if (this.ignoreCase) { - key = key.toLowerCase(); + *keys(): IterableIterator { + for (let key of this.map.keys()) { + yield URI.parse(key); } - - return key; } - keys(): URI[] { - return keys(this.map).map(k => URI.parse(k)); + *entries(): IterableIterator<[URI, T]> { + for (let tuple of this.map.entries()) { + yield [URI.parse(tuple[0]), tuple[1]]; + } } - *[Symbol.iterator](): Iterator<[URI, T]> { + *[Symbol.iterator](): IterableIterator<[URI, T]> { for (let item of this.map) { yield [URI.parse(item[0]), item[1]]; } } + private toKey(resource: URI): string { + let key = resource.toString(); + if (this.ignoreCase) { + key = key.toLowerCase(); + } + + return key; + } + clone(): ResourceMap { const resourceMap = new ResourceMap(); diff --git a/src/vs/base/test/common/map.test.ts b/src/vs/base/test/common/map.test.ts index 737ecf0138a5a..c9a99858854e2 100644 --- a/src/vs/base/test/common/map.test.ts +++ b/src/vs/base/test/common/map.test.ts @@ -656,18 +656,21 @@ suite('Map', () => { assert.equal(map.size, 0); - map.set(resource1, 1); + let res = map.set(resource1, 1); + assert.ok(res === map); map.set(resource2, '2'); map.set(resource3, true); - const values = map.values(); + const values = [...map.values()]; assert.equal(values[0], 1); assert.equal(values[1], '2'); assert.equal(values[2], true); let counter = 0; - map.forEach(value => { + map.forEach((value, key, mapObj) => { assert.equal(value, values[counter++]); + assert.ok(URI.isUri(key)); + assert.ok(map === mapObj); }); const obj = Object.create(null); diff --git a/src/vs/platform/configuration/common/configurationModels.ts b/src/vs/platform/configuration/common/configurationModels.ts index 9998707a68b42..97590263cde21 100644 --- a/src/vs/platform/configuration/common/configurationModels.ts +++ b/src/vs/platform/configuration/common/configurationModels.ts @@ -677,7 +677,7 @@ export class Configuration { overrides: this._workspaceConfiguration.overrides, keys: this._workspaceConfiguration.keys }, - folders: this._folderConfigurations.keys().reduce<[UriComponents, IConfigurationModel][]>((result, folder) => { + folders: [...this._folderConfigurations.keys()].reduce<[UriComponents, IConfigurationModel][]>((result, folder) => { const { contents, overrides, keys } = this._folderConfigurations.get(folder)!; result.push([folder, { contents, overrides, keys }]); return result; diff --git a/src/vs/workbench/contrib/markers/browser/markers.ts b/src/vs/workbench/contrib/markers/browser/markers.ts index 4fef6ba184ac5..a6e8ee54060e0 100644 --- a/src/vs/workbench/contrib/markers/browser/markers.ts +++ b/src/vs/workbench/contrib/markers/browser/markers.ts @@ -40,7 +40,7 @@ export class MarkersWorkbenchService extends Disposable implements IMarkersWorkb resourcesMap = resourcesMap ? resourcesMap : new ResourceMap(); resources.forEach(resource => resourcesMap!.set(resource, resource)); return resourcesMap; - }, 0)(resourcesMap => this.onMarkerChanged(resourcesMap.values()))); + }, 0)(resourcesMap => this.onMarkerChanged([...resourcesMap.values()]))); } private onMarkerChanged(resources: URI[]): void { diff --git a/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts b/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts index 7e3f7995a9207..fd66b9a06b743 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts @@ -101,7 +101,7 @@ export class NotebookEditorModelManager extends Disposable implements INotebookE // private readonly modelLoadQueue = this._register(new ResourceQueue()); get models(): NotebookEditorModel[] { - return this.mapResourceToModel.values(); + return [...this.mapResourceToModel.values()]; } constructor( @IInstantiationService readonly instantiationService: IInstantiationService diff --git a/src/vs/workbench/contrib/search/common/searchModel.ts b/src/vs/workbench/contrib/search/common/searchModel.ts index cfe4f7c54ba51..65948afd51033 100644 --- a/src/vs/workbench/contrib/search/common/searchModel.ts +++ b/src/vs/workbench/contrib/search/common/searchModel.ts @@ -563,7 +563,7 @@ export class FolderMatch extends Disposable { } matches(): FileMatch[] { - return this._fileMatches.values(); + return [...this._fileMatches.values()]; } isEmpty(): boolean { @@ -621,8 +621,8 @@ export class FolderMatch extends Disposable { } private disposeMatches(): void { - this._fileMatches.values().forEach((fileMatch: FileMatch) => fileMatch.dispose()); - this._unDisposedFileMatches.values().forEach((fileMatch: FileMatch) => fileMatch.dispose()); + [...this._fileMatches.values()].forEach((fileMatch: FileMatch) => fileMatch.dispose()); + [...this._unDisposedFileMatches.values()].forEach((fileMatch: FileMatch) => fileMatch.dispose()); this._fileMatches.clear(); this._unDisposedFileMatches.clear(); } diff --git a/src/vs/workbench/services/backup/common/backupFileService.ts b/src/vs/workbench/services/backup/common/backupFileService.ts index 1058dd89b8c42..dbeafa943bc39 100644 --- a/src/vs/workbench/services/backup/common/backupFileService.ts +++ b/src/vs/workbench/services/backup/common/backupFileService.ts @@ -95,7 +95,7 @@ export class BackupFilesModel implements IBackupFilesModel { } get(): URI[] { - return this.cache.keys(); + return [...this.cache.keys()]; } remove(resource: URI): void { diff --git a/src/vs/workbench/services/bulkEdit/browser/conflicts.ts b/src/vs/workbench/services/bulkEdit/browser/conflicts.ts index 99340e7740ba8..341353d2adb61 100644 --- a/src/vs/workbench/services/bulkEdit/browser/conflicts.ts +++ b/src/vs/workbench/services/bulkEdit/browser/conflicts.ts @@ -87,7 +87,7 @@ export class ConflictDetector { } list(): URI[] { - return this._conflicts.keys(); + return [...this._conflicts.keys()]; } hasConflicts(): boolean { diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index 04b5286083455..8232da4637b19 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -190,7 +190,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { } // Handle no longer visible out of workspace resources - this.activeOutOfWorkspaceWatchers.keys().forEach(resource => { + [...this.activeOutOfWorkspaceWatchers.keys()].forEach(resource => { if (!visibleOutOfWorkspaceResources.get(resource)) { dispose(this.activeOutOfWorkspaceWatchers.get(resource)); this.activeOutOfWorkspaceWatchers.delete(resource); diff --git a/src/vs/workbench/services/search/common/searchService.ts b/src/vs/workbench/services/search/common/searchService.ts index 2471bd110a9fd..4c44030ae2771 100644 --- a/src/vs/workbench/services/search/common/searchService.ts +++ b/src/vs/workbench/services/search/common/searchService.ts @@ -74,7 +74,7 @@ export class SearchService extends Disposable implements ISearchService { const localResults = this.getLocalResults(query); if (onProgress) { - arrays.coalesce(localResults.results.values()).forEach(onProgress); + arrays.coalesce([...localResults.results.values()]).forEach(onProgress); } const onProviderProgress = (progress: ISearchProgressItem) => { @@ -99,7 +99,7 @@ export class SearchService extends Disposable implements ISearchService { ...{ limitHit: otherResults.limitHit || localResults.limitHit }, - results: [...otherResults.results, ...arrays.coalesce(localResults.results.values())] + results: [...otherResults.results, ...arrays.coalesce([...localResults.results.values()])] }; } diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts index a962a5338a79e..be50b353debd7 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts @@ -68,7 +68,7 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE })(); get models(): TextFileEditorModel[] { - return this.mapResourceToModel.values(); + return [...this.mapResourceToModel.values()]; } constructor(