@@ -3586,6 +3586,73 @@ export class TestState {
3586
3586
}
3587
3587
}
3588
3588
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
+
3589
3656
public verifyMatchingBracePosition ( bracePosition : number , expectedMatchPosition : number ) {
3590
3657
const actual = this . languageService . getBraceMatchingAtPosition ( this . activeFile . fileName , bracePosition ) ;
3591
3658
0 commit comments