提交 c45f29b2 编写于 作者: C Christof Marti

Track pending updates per editor (fixes #27570)

上级 e0c1e7d2
......@@ -15,6 +15,7 @@ export default class MergeDectorator implements vscode.Disposable {
private config: interfaces.IExtensionConfiguration;
private tracker: interfaces.IDocumentMergeConflictTracker;
private updating = new Map<vscode.TextEditor, boolean>();
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) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册