Skip to content

Commit 4ffa628

Browse files
committed
Creates custom initializer for SourceEdit and removes redundent code
1 parent a60b35a commit 4ffa628

File tree

2 files changed

+29
-45
lines changed

2 files changed

+29
-45
lines changed

Sources/SourceKitLSP/DocumentManager.swift

Lines changed: 26 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,7 @@ public final class DocumentManager {
149149
public func edit(
150150
_ uri: DocumentURI,
151151
newVersion: Int,
152-
edits: [TextDocumentContentChangeEvent],
153-
requiresUpcomingEdits: Bool = false
152+
edits: [TextDocumentContentChangeEvent]
154153
) throws -> (preEditSnapshot: DocumentSnapshot, postEditSnapshot: DocumentSnapshot, edits: [SourceEdit]) {
155154
return try queue.sync {
156155
guard let document = documents[uri] else {
@@ -160,9 +159,7 @@ public final class DocumentManager {
160159

161160
var upcomingEdits: [SourceEdit] = []
162161
for edit in edits {
163-
if requiresUpcomingEdits {
164-
upcomingEdits.append(willEditDocument(document.latestLineTable, edit: edit))
165-
}
162+
upcomingEdits.append(SourceEdit(edit: edit, lineTableBeforeEdit: document.latestLineTable))
166163

167164
if let range = edit.range {
168165
document.latestLineTable.replace(
@@ -195,34 +192,6 @@ public final class DocumentManager {
195192
}
196193
}
197194

198-
private func willEditDocument(_ before: LineTable, edit: TextDocumentContentChangeEvent) -> SourceEdit {
199-
guard let range = edit.range else {
200-
return SourceEdit(
201-
range: Range(
202-
uncheckedBounds: (
203-
AbsolutePosition(utf8Offset: 0),
204-
upper: AbsolutePosition(utf8Offset: before.content.utf8.count)
205-
)
206-
),
207-
replacement: edit.text
208-
)
209-
}
210-
guard let offset = before.utf8OffsetOf(line: range.lowerBound.line, utf16Column: range.lowerBound.utf16index),
211-
let end = before.utf8OffsetOf(line: range.upperBound.line, utf16Column: range.upperBound.utf16index)
212-
else {
213-
fatalError("invalid edit \(range)")
214-
}
215-
return SourceEdit(
216-
range: Range(
217-
uncheckedBounds: (
218-
AbsolutePosition(utf8Offset: offset),
219-
upper: AbsolutePosition(utf8Offset: end)
220-
)
221-
),
222-
replacement: edit.text
223-
)
224-
}
225-
226195
}
227196

228197
extension DocumentManager {
@@ -249,16 +218,36 @@ extension DocumentManager {
249218
/// that logs on failure.
250219
@discardableResult
251220
func edit(
252-
_ note: DidChangeTextDocumentNotification,
253-
requiresUpcomingEdits: Bool = false
221+
_ note: DidChangeTextDocumentNotification
254222
) -> (preEditSnapshot: DocumentSnapshot, postEditSnapshot: DocumentSnapshot, edits: [SourceEdit])? {
255223
return orLog("failed to edit document", level: .error) {
256224
return try edit(
257225
note.textDocument.uri,
258226
newVersion: note.textDocument.version,
259-
edits: note.contentChanges,
260-
requiresUpcomingEdits: requiresUpcomingEdits
227+
edits: note.contentChanges
228+
)
229+
}
230+
}
231+
}
232+
233+
fileprivate extension SourceEdit {
234+
235+
init(edit: TextDocumentContentChangeEvent, lineTableBeforeEdit: LineTable) {
236+
if let range = edit.range {
237+
guard let offset = lineTableBeforeEdit.utf8OffsetOf(line: range.lowerBound.line, utf16Column: range.lowerBound.utf16index),
238+
let end = lineTableBeforeEdit.utf8OffsetOf(line: range.upperBound.line, utf16Column: range.upperBound.utf16index) else {
239+
fatalError("invalid edit \(range)")
240+
}
241+
self.init(
242+
range: AbsolutePosition(utf8Offset: offset)..<AbsolutePosition(utf8Offset: end),
243+
replacement: edit.text
244+
)
245+
} else {
246+
self.init(
247+
range: AbsolutePosition(utf8Offset: 0)..<AbsolutePosition(utf8Offset: lineTableBeforeEdit.content.utf8.count),
248+
replacement: edit.text
261249
)
262250
}
263251
}
252+
264253
}

Sources/SourceKitLSP/Swift/SwiftLanguageServer.swift

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -497,12 +497,10 @@ extension SwiftLanguageServer {
497497
let replacement: String
498498
}
499499

500-
let editResult = self.documentManager.edit(
501-
note,
502-
requiresUpcomingEdits: true
503-
)
500+
guard let (preEditSnapshot, postEditSnapshot, edits) = self.documentManager.edit(note) else {
501+
return
502+
}
504503

505-
let edits = editResult?.edits ?? []
506504
for edit in edits {
507505
let req = sourcekitd.dictionary([
508506
keys.request: self.requests.editorReplaceText,
@@ -522,9 +520,6 @@ extension SwiftLanguageServer {
522520
}
523521
}
524522

525-
guard let (preEditSnapshot, postEditSnapshot, _) = editResult else {
526-
return
527-
}
528523
let concurrentEdits = ConcurrentEdits(
529524
fromSequential: edits.map {
530525
IncrementalEdit(

0 commit comments

Comments
 (0)