@@ -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