Text Document Synchronization
Client support for textDocument/didOpen, textDocument/
didChange and textDocument/didClose notifications is
mandatory in the protocol and clients can not opt out supporting
them. This includes both full and incremental syncronization in
the textDocument/didChange notification. In addition a
server must either implement all three of them or none. Their
capabilities are therefore controlled via a combined client and
server capability.
https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_synchronization
Text Document Synchronization
The actual content changes. The content changes describe single state changes
to the document. So if there are two content changes c1 (at array index 0) and c2
(at array index 1) for a document in state S then c1 moves the document from S
to S' and c2 from S' to S''. So c1 is computed on the state S and c2 is computed
on the state S'.
To mirror the content of a document using change events use the following
approach:
- start with the same initial content
- apply the 'textDocument/didChange' notifications in the order you recevie them.
- apply the `TextDocumentContentChangeEvent`s in a single notification in the
order you receive them.
https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_synchronization
Slide 16
Slide 16 text
Text Document Synchronization
S contentChange
contentChange
contentChange
didChange
Slide 17
Slide 17 text
Text Document Synchronization
S contentChange
contentChange
contentChange
didChange
S′
Slide 18
Slide 18 text
Text Document Synchronization
S′ contentChange
contentChange
didChange
S′′
Slide 19
Slide 19 text
Text Document Synchronization
/// A change to a text document.
///
/// If `range` and `rangeLength` are unspecified,
/// the whole document content is replaced.
///
public struct TextDocumentContentChangeEvent:
Codable, Hashable {
https://github.com/apple/sourcekit-lsp
Slide 20
Slide 20 text
Text Document Synchronization
https://github.com/kishikawakatsumi/swift-playground