import * as vscode from 'vscode' ; export default class MergeConflictContentProvider implements vscode . TextDocumentContentProvider , vscode . Disposable { static scheme = 'merge-conflict.conflict-diff' ; constructor ( private context ) { } begin ( ) { this . context . subscriptions . push ( vscode . workspace . registerTextDocumentContentProvider ( MergeConflictContentProvider . scheme , this ) ) ; } dispose ( ) { } async provideTextDocumentContent ( uri ) { try { const { scheme , ranges } = JSON . parse ( uri . query ) as { scheme : string ; ranges : [ { line : number ; character : number ; } [ ] , { line : number ; character : number ; } [ ] ] [ ] ; } ; 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 ; } } }