Expand description
§Texter
Texter is a crate aiming to simplify writing an LSP using tree-sitter whilst benefiting from
incremental updates. The main type that you will interacte with is Text.
§Usage with lsp-types
change::Change implements From<lsp_types::TextDocumentContentChangeEvent> so in
most cases calling Into::into and providing it to Text::update is enough to keep content
in sync.
§Selecting an encoding
Positions provided from a client may be for different encodings. UTF-8, UTF-16, or
UTF-32. When starting up an LSP, the client provides encoding it will use. With that
information we can store a function pointer and create new Text’s as needed.
The example below works the same way to how it is done in rust-analyzer.
use texter::core::text::Text;
use texter::lsp_types::PositionEncodingKind;
fn decide_encoding() -> fn(String) -> Text {
// The type provided in client capabilities.
let encodings: Option<Vec<PositionEncodingKind>> = get_client_encoding();
let Some(encodings) = encodings else {
return Text::new_utf16;
};
// Hope that we can use anything other than UTF-16
for encoding in encodings {
if encoding == PositionEncodingKind::UTF8 {
return Text::new;
} else if encoding == PositionEncodingKind::UTF32 {
return Text::new_utf32;
}
}
// Too bad, UTF-16 it is.
Text::new_utf16
}§How to write an LSP using the crate?
There is multiple ways to structure your server, texter aims to influence the structure as little as possible.
For an example you can check out trunkls.
§Usage with tree-sitter
When using a Text with incremental updates we want to keep using a single
tree_sitter::Tree across edits. To simplify the process Updateable
is implemented on tree_sitter::Tree. So simply providing a mutable reference of the tree to
a Text’s update method is enough to keep the data in sync.
In case you want to update a tree_sitter::Node, Updateable is implemented
for it as well.
Re-exports§
pub use lsp_types;lsp-typespub use tree_sitter;tree-sitter
Modules§
- change
- A module containing the basic items to perform a change.
- core
- The core functionality of the crate.
- error
- updateables