From c45f29b2b3694d925bec33d82740937bc99bc1ca Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 31 May 2017 11:13:49 -0700 Subject: [PATCH] Track pending updates per editor (fixes #27570) --- .../merge-conflict/src/mergeDecorator.ts | 70 +++++++++++-------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/extensions/merge-conflict/src/mergeDecorator.ts b/extensions/merge-conflict/src/mergeDecorator.ts index 0dd5ad6f6c6..868f383f5d8 100644 --- a/extensions/merge-conflict/src/mergeDecorator.ts +++ b/extensions/merge-conflict/src/mergeDecorator.ts @@ -15,6 +15,7 @@ export default class MergeDectorator implements vscode.Disposable { private config: interfaces.IExtensionConfiguration; private tracker: interfaces.IDocumentMergeConflictTracker; + private updating = new Map(); constructor(private context: vscode.ExtensionContext, trackerService: interfaces.IDocumentMergeConflictTrackerService) { this.tracker = trackerService.createTracker('decorator'); @@ -146,47 +147,54 @@ export default class MergeDectorator implements vscode.Disposable { } // If we have a pending scan from the same origin, exit early. - if (this.tracker.isPending(editor.document)) { + if (this.updating.get(editor)) { return; } - let conflicts = await this.tracker.getConflicts(editor.document); + try { + this.updating.set(editor, true); - if (conflicts.length === 0) { - this.removeDecorations(editor); - return; - } + let conflicts = await this.tracker.getConflicts(editor.document); - // Store decorations keyed by the type of decoration, set decoration wants a "style" - // to go with it, which will match this key (see constructor); - let matchDecorations: { [key: string]: vscode.DecorationOptions[] } = {}; + if (conflicts.length === 0) { + this.removeDecorations(editor); + return; + } - let pushDecoration = (key: string, d: vscode.DecorationOptions) => { - matchDecorations[key] = matchDecorations[key] || []; - matchDecorations[key].push(d); - }; + // Store decorations keyed by the type of decoration, set decoration wants a "style" + // to go with it, which will match this key (see constructor); + let matchDecorations: { [key: string]: vscode.DecorationOptions[] } = {}; - conflicts.forEach(conflict => { - // TODO, this could be more effective, just call getMatchPositions once with a map of decoration to position - pushDecoration('current.content', { range: conflict.current.decoratorContent }); - pushDecoration('incoming.content', { range: conflict.incoming.decoratorContent }); + let pushDecoration = (key: string, d: vscode.DecorationOptions) => { + matchDecorations[key] = matchDecorations[key] || []; + matchDecorations[key].push(d); + }; - if (this.config.enableDecorations) { - pushDecoration('current.header', { range: conflict.current.header }); - pushDecoration('splitter', { range: conflict.splitter }); - pushDecoration('incoming.header', { range: conflict.incoming.header }); - } - }); + conflicts.forEach(conflict => { + // TODO, this could be more effective, just call getMatchPositions once with a map of decoration to position + pushDecoration('current.content', { range: conflict.current.decoratorContent }); + pushDecoration('incoming.content', { range: conflict.incoming.decoratorContent }); - // For each match we've generated, apply the generated decoration with the matching decoration type to the - // editor instance. Keys in both matches and decorations should match. - Object.keys(matchDecorations).forEach(decorationKey => { - let decorationType = this.decorations[decorationKey]; + if (this.config.enableDecorations) { + pushDecoration('current.header', { range: conflict.current.header }); + pushDecoration('splitter', { range: conflict.splitter }); + pushDecoration('incoming.header', { range: conflict.incoming.header }); + } + }); - if (decorationType) { - editor.setDecorations(decorationType, matchDecorations[decorationKey]); - } - }); + // For each match we've generated, apply the generated decoration with the matching decoration type to the + // editor instance. Keys in both matches and decorations should match. + Object.keys(matchDecorations).forEach(decorationKey => { + let decorationType = this.decorations[decorationKey]; + + if (decorationType) { + editor.setDecorations(decorationType, matchDecorations[decorationKey]); + } + }); + + } finally { + this.updating.delete(editor); + } } private removeDecorations(editor: vscode.TextEditor) { -- GitLab