@@ -14,20 +14,6 @@ import SwiftDiagnostics
14
14
import SwiftSyntax
15
15
16
16
public 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
-
31
17
/// Applies selected or all Fix-Its from the provided diagnostics to a given syntax tree.
32
18
///
33
19
/// - Parameters:
@@ -44,13 +30,12 @@ public enum FixItApplier {
44
30
) -> String {
45
31
let messages = messages ?? diagnostics. compactMap { $0. fixIts. first? . message. message }
46
32
47
- let changes =
33
+ var edits =
48
34
diagnostics
49
35
. flatMap ( \. fixIts)
50
36
. filter { messages. contains ( $0. message. message) }
51
- . flatMap ( \. changes )
37
+ . flatMap ( \. edits )
52
38
53
- var edits : [ Edit ] = changes. map ( \. edit)
54
39
var source = tree. description
55
40
56
41
while let edit = edits. first {
@@ -61,9 +46,7 @@ public enum FixItApplier {
61
46
62
47
source. replaceSubrange ( startIndex..< endIndex, with: edit. replacement)
63
48
64
- edits = edits. compactMap { remainingEdit -> FixItApplier . Edit ? in
65
- var remainingEdit = remainingEdit
66
-
49
+ edits = edits. compactMap { remainingEdit -> SourceEdit ? in
67
50
if remainingEdit. replacementRange. overlaps ( edit. replacementRange) {
68
51
// The edit overlaps with the previous edit. We can't apply both
69
52
// without conflicts. Apply the one that's listed first and drop the
@@ -74,8 +57,9 @@ public enum FixItApplier {
74
57
// If the remaining edit starts after or at the end of the edit that we just applied,
75
58
// shift it by the current edit's difference in length.
76
59
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)
79
63
}
80
64
81
65
return remainingEdit
@@ -86,29 +70,20 @@ public enum FixItApplier {
86
70
}
87
71
}
88
72
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
+ }
98
81
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
+ }
105
85
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
113
88
}
114
89
}
0 commit comments