@@ -3586,6 +3586,73 @@ export class TestState {
35863586 }
35873587 }
35883588
3589+ public baselineLinkedEditing ( ) : void {
3590+ const baselineFile = this . getBaselineFileNameForContainingTestFile ( ".linkedEditing.txt" ) ;
3591+ const files = this . testData . files ;
3592+
3593+ let baselineContent = "" ;
3594+ let offset = 0 ;
3595+ for ( const f of files ) {
3596+ const result = getLinkedEditingBaselineWorker ( f , offset , this . languageService ) ;
3597+ baselineContent += result . baselineContent + `\n\n\n` ;
3598+ offset = result . offset ;
3599+ }
3600+
3601+ Harness . Baseline . runBaseline ( baselineFile , baselineContent ) ;
3602+
3603+ function getLinkedEditingBaselineWorker ( activeFile : FourSlashFile , offset : number , languageService : ts . LanguageService ) {
3604+ const fileName = activeFile . fileName ;
3605+ let baselineContent = `=== ${ fileName } ===\n` ;
3606+
3607+ // get linkedEdit at every position in the file, then group positions by their linkedEdit
3608+ const linkedEditsInFile = new Map < string , number [ ] > ( ) ;
3609+ for ( let pos = 0 ; pos < activeFile . content . length ; pos ++ ) {
3610+ const linkedEditAtPosition = languageService . getLinkedEditingRangeAtPosition ( fileName , pos ) ;
3611+ if ( ! linkedEditAtPosition ) continue ;
3612+
3613+ const linkedEditString = JSON . stringify ( linkedEditAtPosition ) ;
3614+ const existingPositions = linkedEditsInFile . get ( linkedEditString ) ?? [ ] ;
3615+ linkedEditsInFile . set ( linkedEditString , [ ...existingPositions , pos ] ) ;
3616+ }
3617+
3618+ const linkedEditsByRange = [ ...linkedEditsInFile . entries ( ) ] . sort ( ( a , b ) => a [ 1 ] [ 0 ] - b [ 1 ] [ 0 ] ) ;
3619+ if ( linkedEditsByRange . length === 0 ) {
3620+ return { baselineContent : baselineContent + activeFile . content + `\n\n--No linked edits found--` , offset } ;
3621+ }
3622+
3623+ let inlineLinkedEditBaselines : { start : number , end : number , index : number } [ ] = [ ] ;
3624+ let linkedEditInfoBaseline = "" ;
3625+ for ( const edit of linkedEditsByRange ) {
3626+ const [ linkedEdit , positions ] = edit ;
3627+ let rangeStart = 0 ;
3628+ for ( let j = 0 ; j < positions . length - 1 ; j ++ ) {
3629+ // for each distinct range in the list of positions, add an entry to the list of places that need to be annotated in the baseline
3630+ if ( positions [ j ] + 1 !== positions [ j + 1 ] ) {
3631+ inlineLinkedEditBaselines . push ( { start : positions [ rangeStart ] , end : positions [ j ] , index : offset } ) ;
3632+ rangeStart = j + 1 ;
3633+ }
3634+ }
3635+ inlineLinkedEditBaselines . push ( { start : positions [ rangeStart ] , end : positions [ positions . length - 1 ] , index : offset } ) ;
3636+
3637+ // add the LinkedEditInfo with its index to the baseline
3638+ linkedEditInfoBaseline += `\n\n=== ${ offset } ===\n` + linkedEdit ;
3639+ offset ++ ;
3640+ }
3641+
3642+ inlineLinkedEditBaselines = inlineLinkedEditBaselines . sort ( ( a , b ) => a . start - b . start ) ;
3643+ const fileText = activeFile . content ;
3644+ baselineContent += fileText . slice ( 0 , inlineLinkedEditBaselines [ 0 ] . start ) ;
3645+ for ( let i = 0 ; i < inlineLinkedEditBaselines . length ; i ++ ) {
3646+ const e = inlineLinkedEditBaselines [ i ] ;
3647+ const sliceEnd = inlineLinkedEditBaselines [ i + 1 ] ?. start ;
3648+ baselineContent += `[|/*${ e . index } */` + fileText . slice ( e . start , e . end ) + `|]` + fileText . slice ( e . end , sliceEnd ) ;
3649+ }
3650+
3651+ baselineContent += linkedEditInfoBaseline ;
3652+ return { baselineContent, offset } ;
3653+ }
3654+ }
3655+
35893656 public verifyMatchingBracePosition ( bracePosition : number , expectedMatchPosition : number ) {
35903657 const actual = this . languageService . getBraceMatchingAtPosition ( this . activeFile . fileName , bracePosition ) ;
35913658
0 commit comments