Skip to content

Commit cb14bd0

Browse files
committed
Don’t fatalError if TextDocumentContentChangeEvent could not be converted to a SourceEdit
1 parent 7a65050 commit cb14bd0

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

Sources/SourceKitLSP/DocumentManager.swift

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ public final class DocumentManager {
9292
public enum Error: Swift.Error {
9393
case alreadyOpen(DocumentURI)
9494
case missingDocument(DocumentURI)
95+
case failedToConvertPosition
9596
}
9697

9798
let queue: DispatchQueue = DispatchQueue(label: "document-manager-queue")
@@ -159,7 +160,10 @@ public final class DocumentManager {
159160

160161
var sourceEdits: [SourceEdit] = []
161162
for edit in edits {
162-
sourceEdits.append(SourceEdit(edit: edit, lineTableBeforeEdit: document.latestLineTable))
163+
guard let sourceEdit = SourceEdit(edit: edit, lineTableBeforeEdit: document.latestLineTable) else {
164+
throw Error.failedToConvertPosition
165+
}
166+
sourceEdits.append(sourceEdit)
163167

164168
if let range = edit.range {
165169
document.latestLineTable.replace(
@@ -230,7 +234,11 @@ extension DocumentManager {
230234
}
231235

232236
fileprivate extension SourceEdit {
233-
init(edit: TextDocumentContentChangeEvent, lineTableBeforeEdit: LineTable) {
237+
/// Constructs a `SourceEdit` from the given `TextDocumentContentChangeEvent`.
238+
///
239+
/// Returns `nil` if the `TextDocumentContentChangeEvent` refers to line:column positions that don't exist in
240+
/// `LineTable`.
241+
init?(edit: TextDocumentContentChangeEvent, lineTableBeforeEdit: LineTable) {
234242
if let range = edit.range {
235243
guard
236244
let offset = lineTableBeforeEdit.utf8OffsetOf(
@@ -242,7 +250,7 @@ fileprivate extension SourceEdit {
242250
utf16Column: range.upperBound.utf16index
243251
)
244252
else {
245-
fatalError("invalid edit \(range)")
253+
return nil
246254
}
247255
self.init(
248256
range: AbsolutePosition(utf8Offset: offset)..<AbsolutePosition(utf8Offset: end),

0 commit comments

Comments
 (0)