Skip to content

Commit f9ba8b4

Browse files
committed
Convert sourcekitd response to ConcurrentEdits
1 parent 9a97653 commit f9ba8b4

File tree

4 files changed

+49
-14
lines changed

4 files changed

+49
-14
lines changed

Sources/SourceKitLSP/Swift/MacroExpansion.swift

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,10 @@ struct MacroExpansion: RefactoringResponse {
2929
/// The resulting array of `RefactoringEdit` of a semantic refactoring request
3030
var edits: [RefactoringEdit]
3131

32-
init(title: String, uri: DocumentURI, refactoringEdits: [RefactoringEdit]) {
32+
init(title: String, snapshot: DocumentSnapshot, refactoringEdits: [RefactoringEdit]) {
3333
self.title = title
34-
self.uri = uri
35-
self.edits = refactoringEdits.compactMap { refactoringEdit in
36-
if refactoringEdit.bufferName.isEmpty {
37-
logger.fault("Unable to retrieve some parts of the expansion")
38-
return nil
39-
}
40-
41-
return refactoringEdit
42-
}
34+
self.uri = snapshot.uri
35+
self.edits = refactoringEdits.concurrent(to: snapshot) // Bug: Line number is wrong and test fails
4336
}
4437
}
4538

Sources/SourceKitLSP/Swift/Refactoring.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import LanguageServerProtocol
1515
import SourceKitD
1616

1717
protocol RefactoringResponse {
18-
init(title: String, uri: DocumentURI, refactoringEdits: [RefactoringEdit])
18+
init(title: String, snapshot: DocumentSnapshot, refactoringEdits: [RefactoringEdit])
1919
}
2020

2121
extension RefactoringResponse {
@@ -81,7 +81,7 @@ extension RefactoringResponse {
8181
return nil
8282
}
8383

84-
self.init(title: title, uri: snapshot.uri, refactoringEdits: refactoringEdits)
84+
self.init(title: title, snapshot: snapshot, refactoringEdits: refactoringEdits)
8585
}
8686
}
8787

Sources/SourceKitLSP/Swift/RefactoringEdit.swift

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
import LanguageServerProtocol
1414
import SourceKitD
15+
import SwiftParser
16+
import SwiftSyntax
1517

1618
/// Represents an edit from semantic refactor response. Notionally, a subclass of `TextEdit`
1719
@_spi(Testing) public struct RefactoringEdit: Hashable, Sendable, Codable {
@@ -59,3 +61,43 @@ extension RefactoringEdit: LSPAnyCodable {
5961
])
6062
}
6163
}
64+
65+
@_spi(Testing)
66+
public
67+
extension Array where Element == RefactoringEdit
68+
{
69+
func concurrent(to snapshot: DocumentSnapshot) -> [RefactoringEdit] {
70+
let sequentialEdits = self.map { refactoringEdit in
71+
let startUtf8Column = snapshot.lineTable.utf8ColumnAt(
72+
line: refactoringEdit.range.lowerBound.line,
73+
utf16Column: refactoringEdit.range.lowerBound.utf16index
74+
)
75+
76+
let absoluteStartPosition = AbsolutePosition(utf8Offset: startUtf8Column)
77+
78+
let endUtf8Column = snapshot.lineTable.utf8ColumnAt(
79+
line: refactoringEdit.range.upperBound.line,
80+
utf16Column: refactoringEdit.range.upperBound.utf16index
81+
)
82+
83+
let absoluteEndPosition = AbsolutePosition(utf8Offset: endUtf8Column)
84+
85+
return SourceEdit(range: absoluteStartPosition..<absoluteEndPosition, replacement: refactoringEdit.newText)
86+
}
87+
88+
let concurrentEdits = ConcurrentEdits(fromSequential: sequentialEdits)
89+
90+
var refactoringEdits = [RefactoringEdit]()
91+
for (i, concurrentEdit) in concurrentEdits.edits.enumerated() {
92+
refactoringEdits.append(
93+
RefactoringEdit(
94+
range: snapshot.absolutePositionRange(of: concurrentEdit.range),
95+
newText: concurrentEdit.replacement,
96+
bufferName: self[i].bufferName // Is there a better way to access bufferName after receiving concurrentEdits?
97+
)
98+
)
99+
}
100+
101+
return refactoringEdits
102+
}
103+
}

Sources/SourceKitLSP/Swift/SemanticRefactoring.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ struct SemanticRefactoring: RefactoringResponse {
3131
self.edit = edit
3232
}
3333

34-
init(title: String, uri: DocumentURI, refactoringEdits: [RefactoringEdit]) {
34+
init(title: String, snapshot: DocumentSnapshot, refactoringEdits: [RefactoringEdit]) {
3535
self.title = title
3636
self.edit = WorkspaceEdit(changes: [
37-
uri: refactoringEdits.map { TextEdit(range: $0.range, newText: $0.newText) }
37+
snapshot.uri: refactoringEdits.map { TextEdit(range: $0.range, newText: $0.newText) }
3838
])
3939
}
4040
}

0 commit comments

Comments
 (0)