diff --git a/src/vs/platform/markers/common/markerService.ts b/src/vs/platform/markers/common/markerService.ts index 901d85a0abd..d393f5bcfe2 100644 --- a/src/vs/platform/markers/common/markerService.ts +++ b/src/vs/platform/markers/common/markerService.ts @@ -9,7 +9,7 @@ import network = require('vs/base/common/network'); import strings = require('vs/base/common/strings'); import collections = require('vs/base/common/collections'); import URI from 'vs/base/common/uri'; -import Event, {Emitter} from 'vs/base/common/event'; +import Event, {Emitter, debounceEvent} from 'vs/base/common/event'; import Severity from 'vs/base/common/severity'; import {IMarkerService, IMarkerData, IResourceMarker, IMarker, MarkerStatistics} from './markers'; @@ -49,15 +49,21 @@ export interface MarkerData { export class MarkerService implements IMarkerService { + public _serviceBrand: any; + private _data: { [k: string]: IMarkerData[] }; + private _stats: MarkerStatistics; - private _onMarkerChanged: Emitter; + + private _onMarkerChanged = new Emitter(); + + private _onMarkerChangedEvent: Event = debounceEvent(this._onMarkerChanged.event, MarkerService._debouncer, 0); + constructor() { this._data = Object.create(null); this._stats = this._emptyStats(); - this._onMarkerChanged = new Emitter(); } public getStatistics(): MarkerStatistics { @@ -67,7 +73,7 @@ export class MarkerService implements IMarkerService { // ---- IMarkerService ------------------------------------------ public get onMarkerChanged(): Event { - return this._onMarkerChanged ? this._onMarkerChanged.event : null; + return this._onMarkerChangedEvent; } public changeOne(owner: string, resource: URI, markers: IMarkerData[]): void { @@ -294,4 +300,22 @@ export class MarkerService implements IMarkerService { data.endColumn = data.endColumn > 0 ? data.endColumn : data.startColumn; return true; } + + // --- event debounce logic + + private static _dedupeMap: { [uri: string]: boolean }; + + private static _debouncer(last: URI[], event: URI[]): URI[] { + if (!last) { + MarkerService._dedupeMap = Object.create(null); + last = []; + } + for (const uri of event) { + if (MarkerService._dedupeMap[uri.toString()] === void 0) { + MarkerService._dedupeMap[uri.toString()] = true; + last.push(uri); + } + } + return last; + } }