aboutsummaryrefslogtreecommitdiff
path: root/helix-lsp/src/client.rs
diff options
context:
space:
mode:
authorBlaž Hrastnik2021-04-14 06:30:15 +0000
committerBlaž Hrastnik2021-04-14 06:39:31 +0000
commit3e5f24a9d5cec26697a75e515bff46de418b32da (patch)
treede3cf4a3be699798d3797f5af2d52a1e58227155 /helix-lsp/src/client.rs
parent811f952a41177242f7dfa4d66f2b16157f918718 (diff)
lsp: support both utf-8 and utf-16 offsets.
Still need to implement the clangd encoding negotiation, but it's a start. Should also manually override to utf8 for pyls.
Diffstat (limited to 'helix-lsp/src/client.rs')
-rw-r--r--helix-lsp/src/client.rs17
1 files changed, 11 insertions, 6 deletions
diff --git a/helix-lsp/src/client.rs b/helix-lsp/src/client.rs
index 64070be0..c70e6e78 100644
--- a/helix-lsp/src/client.rs
+++ b/helix-lsp/src/client.rs
@@ -1,6 +1,6 @@
use crate::{
transport::{Payload, Transport},
- Call, Error, Result,
+ Call, Error, OffsetEncoding, Result,
};
use helix_core::{ChangeSet, Rope};
@@ -29,8 +29,7 @@ pub struct Client {
pub request_counter: AtomicU64,
capabilities: Option<lsp::ServerCapabilities>,
- // TODO: handle PublishDiagnostics Version
- // diagnostics: HashMap<lsp::Url, Vec<lsp::Diagnostic>>,
+ offset_encoding: OffsetEncoding,
}
impl Client {
@@ -70,6 +69,7 @@ impl Client {
capabilities: None,
// diagnostics: HashMap::new(),
+ offset_encoding: OffsetEncoding::Utf8,
};
// TODO: async client.initialize()
@@ -100,6 +100,10 @@ impl Client {
.expect("language server not yet initialized!")
}
+ pub fn offset_encoding(&self) -> OffsetEncoding {
+ self.offset_encoding
+ }
+
/// Execute a RPC request on the language server.
pub async fn request<R: lsp::request::Request>(&self, params: R::Params) -> Result<R::Result>
where
@@ -291,6 +295,7 @@ impl Client {
old_text: &Rope,
new_text: &Rope,
changeset: &ChangeSet,
+ offset_encoding: OffsetEncoding,
) -> Vec<lsp::TextDocumentContentChangeEvent> {
let mut iter = changeset.changes().iter().peekable();
let mut old_pos = 0;
@@ -340,7 +345,7 @@ impl Client {
new_pos += i;
}
Delete(_) => {
- let start = pos_to_lsp_pos(new_text, new_pos);
+ let start = pos_to_lsp_pos(new_text, new_pos, offset_encoding);
let end = traverse(start, old_text.slice(old_pos..old_end));
// deletion
@@ -351,7 +356,7 @@ impl Client {
});
}
Insert(s) => {
- let start = pos_to_lsp_pos(new_text, new_pos);
+ let start = pos_to_lsp_pos(new_text, new_pos, offset_encoding);
new_pos += s.chars().count();
@@ -413,7 +418,7 @@ impl Client {
}]
}
lsp::TextDocumentSyncKind::Incremental => {
- Self::changeset_to_changes(old_text, new_text, changes)
+ Self::changeset_to_changes(old_text, new_text, changes, self.offset_encoding)
}
lsp::TextDocumentSyncKind::None => return Ok(()),
};