@@ -14,20 +14,6 @@ import SwiftDiagnostics
1414import  SwiftSyntax
1515
1616public  enum  FixItApplier  { 
17-   struct  Edit :  Equatable  { 
18-     var  startUtf8Offset :  Int 
19-     var  endUtf8Offset :  Int 
20-     let  replacement :  String 
21- 
22-     var  replacementLength :  Int  { 
23-       return  replacement. utf8. count
24-     } 
25- 
26-     var  replacementRange :  Range < Int >  { 
27-       return  startUtf8Offset..< endUtf8Offset
28-     } 
29-   } 
30- 
3117  /// Applies selected or all Fix-Its from the provided diagnostics to a given syntax tree.
3218  ///
3319  /// - Parameters:
@@ -44,13 +30,12 @@ public enum FixItApplier {
4430  )  ->  String  { 
4531    let  messages  =  messages ??  diagnostics. compactMap {  $0. fixIts. first? . message. message } 
4632
47-     let   changes  = 
33+     var   edits  = 
4834      diagnostics
4935      . flatMap ( \. fixIts) 
5036      . filter  {  messages. contains ( $0. message. message)  } 
51-       . flatMap ( \. changes ) 
37+       . flatMap ( \. edits ) 
5238
53-     var  edits :  [ Edit ]  =  changes. map ( \. edit) 
5439    var  source  =  tree. description
5540
5641    while  let  edit =  edits. first { 
@@ -61,9 +46,7 @@ public enum FixItApplier {
6146
6247      source. replaceSubrange ( startIndex..< endIndex,  with:  edit. replacement) 
6348
64-       edits =  edits. compactMap  {  remainingEdit ->  FixItApplier . Edit ?   in 
65-         var  remainingEdit  =  remainingEdit
66- 
49+       edits =  edits. compactMap  {  remainingEdit ->  SourceEdit ?   in 
6750        if  remainingEdit. replacementRange. overlaps ( edit. replacementRange)  { 
6851          // The edit overlaps with the previous edit. We can't apply both
6952          // without conflicts. Apply the one that's listed first and drop the
@@ -74,8 +57,9 @@ public enum FixItApplier {
7457        // If the remaining edit starts after or at the end of the edit that we just applied,
7558        // shift it by the current edit's difference in length.
7659        if  edit. endUtf8Offset <=  remainingEdit. startUtf8Offset { 
77-           remainingEdit. startUtf8Offset =  remainingEdit. startUtf8Offset -  edit. replacementRange. count +  edit. replacementLength
78-           remainingEdit. endUtf8Offset =  remainingEdit. endUtf8Offset -  edit. replacementRange. count +  edit. replacementLength
60+           let  startPosition  =  AbsolutePosition ( utf8Offset:  remainingEdit. startUtf8Offset -  edit. replacementRange. count +  edit. replacementLength) 
61+           let  endPosition  =  AbsolutePosition ( utf8Offset:  remainingEdit. endUtf8Offset -  edit. replacementRange. count +  edit. replacementLength) 
62+           return  SourceEdit ( range:  startPosition ..<  endPosition,  replacement:  remainingEdit. replacement) 
7963        } 
8064
8165        return  remainingEdit
@@ -86,29 +70,20 @@ public enum FixItApplier {
8670  } 
8771} 
8872
89- fileprivate  extension  FixIt . Change  { 
90-   var  edit :  FixItApplier . Edit  { 
91-     switch  self  { 
92-     case  . replace( let  oldNode,  let  newNode) : 
93-       return  FixItApplier . Edit ( 
94-         startUtf8Offset:  oldNode. position. utf8Offset, 
95-         endUtf8Offset:  oldNode. endPosition. utf8Offset, 
96-         replacement:  newNode. description
97-       ) 
73+ private  extension  SourceEdit  { 
74+   var  startUtf8Offset :  Int  { 
75+     return  range. lowerBound. utf8Offset
76+   } 
77+ 
78+   var  endUtf8Offset :  Int  { 
79+     return  range. upperBound. utf8Offset
80+   } 
9881
99-     case  . replaceLeadingTrivia( let  token,  let  newTrivia) : 
100-       return  FixItApplier . Edit ( 
101-         startUtf8Offset:  token. position. utf8Offset, 
102-         endUtf8Offset:  token. positionAfterSkippingLeadingTrivia. utf8Offset, 
103-         replacement:  newTrivia. description
104-       ) 
82+   var  replacementLength :  Int  { 
83+     return  replacement. utf8. count
84+   } 
10585
106-     case  . replaceTrailingTrivia( let  token,  let  newTrivia) : 
107-       return  FixItApplier . Edit ( 
108-         startUtf8Offset:  token. endPositionBeforeTrailingTrivia. utf8Offset, 
109-         endUtf8Offset:  token. endPosition. utf8Offset, 
110-         replacement:  newTrivia. description
111-       ) 
112-     } 
86+   var  replacementRange :  Range < Int >  { 
87+     return  startUtf8Offset..< endUtf8Offset
11388  } 
11489} 
0 commit comments