/*--------------------------------------------------------------------------------------------- * 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 { 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; } } }