@@ -92,6 +92,7 @@ public final class DocumentManager {
92
92
public enum Error : Swift . Error {
93
93
case alreadyOpen( DocumentURI )
94
94
case missingDocument( DocumentURI )
95
+ case failedToConvertPosition
95
96
}
96
97
97
98
let queue : DispatchQueue = DispatchQueue ( label: " document-manager-queue " )
@@ -159,7 +160,10 @@ public final class DocumentManager {
159
160
160
161
var sourceEdits : [ SourceEdit ] = [ ]
161
162
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)
163
167
164
168
if let range = edit. range {
165
169
document. latestLineTable. replace (
@@ -230,7 +234,11 @@ extension DocumentManager {
230
234
}
231
235
232
236
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 ) {
234
242
if let range = edit. range {
235
243
guard
236
244
let offset = lineTableBeforeEdit. utf8OffsetOf (
@@ -242,7 +250,7 @@ fileprivate extension SourceEdit {
242
250
utf16Column: range. upperBound. utf16index
243
251
)
244
252
else {
245
- fatalError ( " invalid edit \( range ) " )
253
+ return nil
246
254
}
247
255
self . init (
248
256
range: AbsolutePosition ( utf8Offset: offset) ..< AbsolutePosition ( utf8Offset: end) ,
0 commit comments