54 lines
2.0 KiB
TypeScript
54 lines
2.0 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import * as vscode from 'vscode';
|
|
|
|
export default class MergeConflictContentProvider implements vscode.TextDocumentContentProvider, vscode.Disposable {
|
|
|
|
static scheme = 'merge-conflict.conflict-diff';
|
|
|
|
constructor(private context: vscode.ExtensionContext) {
|
|
}
|
|
|
|
begin() {
|
|
this.context.subscriptions.push(
|
|
vscode.workspace.registerTextDocumentContentProvider(MergeConflictContentProvider.scheme, this)
|
|
);
|
|
}
|
|
|
|
dispose() {
|
|
}
|
|
|
|
async provideTextDocumentContent(uri: vscode.Uri): Promise<string | null> {
|
|
try {
|
|
const { scheme, ranges } = JSON.parse(uri.query) as { scheme: string, ranges: [{ line: number, character: number }[], { line: number, character: number }[]][] };
|
|
|
|
// complete diff
|
|
const document = await vscode.workspace.openTextDocument(uri.with({ scheme, query: '' }));
|
|
|
|
let text = '';
|
|
let lastPosition = new vscode.Position(0, 0);
|
|
|
|
ranges.forEach(rangeObj => {
|
|
let [conflictRange, fullRange] = rangeObj;
|
|
const [start, end] = conflictRange;
|
|
const [fullStart, fullEnd] = fullRange;
|
|
|
|
text += document.getText(new vscode.Range(lastPosition.line, lastPosition.character, fullStart.line, fullStart.character));
|
|
text += document.getText(new vscode.Range(start.line, start.character, end.line, end.character));
|
|
lastPosition = new vscode.Position(fullEnd.line, fullEnd.character);
|
|
});
|
|
|
|
let documentEnd = document.lineAt(document.lineCount - 1).range.end;
|
|
text += document.getText(new vscode.Range(lastPosition.line, lastPosition.character, documentEnd.line, documentEnd.character));
|
|
|
|
return text;
|
|
}
|
|
catch (ex) {
|
|
await vscode.window.showErrorMessage('Unable to show comparison');
|
|
return null;
|
|
}
|
|
}
|
|
} |