@@ -259,10 +259,10 @@ extension SwiftLanguageServer {
259
259
}
260
260
261
261
/// Tell sourcekitd to crash itself. For testing purposes only.
262
- public func _crash( ) {
262
+ public func _crash( ) async {
263
263
let req = SKDRequestDictionary ( sourcekitd: sourcekitd)
264
264
req [ sourcekitd. keys. request] = sourcekitd. requests. crash_exit
265
- _ = try ? sourcekitd. sendSync ( req)
265
+ _ = try ? await sourcekitd. send ( req)
266
266
}
267
267
268
268
// MARK: - Build System Integration
@@ -276,7 +276,7 @@ extension SwiftLanguageServer {
276
276
let closeReq = SKDRequestDictionary ( sourcekitd: self . sourcekitd)
277
277
closeReq [ keys. request] = self . requests. editor_close
278
278
closeReq [ keys. name] = path
279
- _ = try ? self . sourcekitd. sendSync ( closeReq)
279
+ _ = try ? await self . sourcekitd. send ( closeReq)
280
280
281
281
let openReq = SKDRequestDictionary ( sourcekitd: self . sourcekitd)
282
282
openReq [ keys. request] = self . requests. editor_open
@@ -286,7 +286,7 @@ extension SwiftLanguageServer {
286
286
openReq [ keys. compilerargs] = compileCmd. compilerArgs
287
287
}
288
288
289
- _ = try ? self . sourcekitd. sendSync ( openReq)
289
+ _ = try ? await self . sourcekitd. send ( openReq)
290
290
291
291
publishDiagnosticsIfNeeded ( for: snapshot. uri)
292
292
}
@@ -336,7 +336,7 @@ extension SwiftLanguageServer {
336
336
req [ keys. compilerargs] = compilerArgs
337
337
}
338
338
339
- _ = try ? self . sourcekitd. sendSync ( req)
339
+ _ = try ? await self . sourcekitd. send ( req)
340
340
publishDiagnosticsIfNeeded ( for: note. textDocument. uri)
341
341
}
342
342
@@ -354,7 +354,7 @@ extension SwiftLanguageServer {
354
354
req [ keys. request] = self . requests. editor_close
355
355
req [ keys. name] = uri. pseudoPath
356
356
357
- _ = try ? self . sourcekitd. sendSync ( req)
357
+ _ = try ? await self . sourcekitd. send ( req)
358
358
}
359
359
360
360
/// Cancels any in-flight tasks to send a `PublishedDiagnosticsNotification` after edits.
@@ -422,46 +422,66 @@ extension SwiftLanguageServer {
422
422
cancelInFlightPublishDiagnosticsTask ( for: note. textDocument. uri)
423
423
424
424
let keys = self . keys
425
- var edits : [ IncrementalEdit ] = [ ]
425
+ struct Edit {
426
+ let offset : Int
427
+ let length : Int
428
+ let replacement : String
429
+ }
430
+
431
+ var edits : [ Edit ] = [ ]
426
432
427
433
let editResult = self . documentManager. edit ( note) {
428
434
( before: LineTable , edit: TextDocumentContentChangeEvent ) in
429
- let req = SKDRequestDictionary ( sourcekitd: self . sourcekitd)
430
- req [ keys. request] = self . requests. editor_replacetext
431
- req [ keys. name] = note. textDocument. uri. pseudoPath
432
- req [ keys. syntactic_only] = 1
433
-
434
435
if let range = edit. range {
435
436
guard let offset = before. utf8OffsetOf ( line: range. lowerBound. line, utf16Column: range. lowerBound. utf16index) ,
436
437
let end = before. utf8OffsetOf ( line: range. upperBound. line, utf16Column: range. upperBound. utf16index)
437
438
else {
438
439
fatalError ( " invalid edit \( range) " )
439
440
}
440
-
441
- let length = end - offset
442
- req [ keys. offset] = offset
443
- req [ keys. length] = length
444
-
445
- edits. append ( IncrementalEdit ( offset: offset, length: length, replacementLength: edit. text. utf8. count) )
441
+ edits. append (
442
+ Edit (
443
+ offset: offset,
444
+ length: end - offset,
445
+ replacement: edit. text
446
+ )
447
+ )
446
448
} else {
447
- // Full text
448
- let length = before. content. utf8. count
449
- req [ keys. offset] = 0
450
- req [ keys. length] = length
451
-
452
- edits. append ( IncrementalEdit ( offset: 0 , length: length, replacementLength: edit. text. utf8. count) )
449
+ edits. append (
450
+ Edit (
451
+ offset: 0 ,
452
+ length: before. content. utf8. count,
453
+ replacement: edit. text
454
+ )
455
+ )
453
456
}
454
-
455
- req [ keys. sourcetext] = edit. text
456
- _ = try ? self . sourcekitd. sendSync ( req)
457
457
}
458
+ for edit in edits {
459
+ let req = SKDRequestDictionary ( sourcekitd: self . sourcekitd)
460
+ req [ keys. request] = self . requests. editor_replacetext
461
+ req [ keys. name] = note. textDocument. uri. pseudoPath
462
+ req [ keys. syntactic_only] = 1
463
+ req [ keys. offset] = edit. offset
464
+ req [ keys. length] = edit. length
465
+ req [ keys. sourcetext] = edit. replacement
466
+ do {
467
+ _ = try await self . sourcekitd. send ( req)
468
+ } catch {
469
+ fatalError ( " failed to apply edit " )
470
+ }
471
+ }
472
+
458
473
guard let ( preEditSnapshot, postEditSnapshot) = editResult else {
459
474
return
460
475
}
476
+ let concurrentEdits = ConcurrentEdits (
477
+ fromSequential: edits. map {
478
+ IncrementalEdit ( offset: $0. offset, length: $0. length, replacementLength: $0. replacement. utf8. count)
479
+ }
480
+ )
461
481
await syntaxTreeManager. registerEdit (
462
482
preEditSnapshot: preEditSnapshot,
463
483
postEditSnapshot: postEditSnapshot,
464
- edits: ConcurrentEdits ( fromSequential : edits )
484
+ edits: concurrentEdits
465
485
)
466
486
467
487
publishDiagnosticsIfNeeded ( for: note. textDocument. uri)
0 commit comments