Fix byte index error in signature help highlighting

The language server sends a char offset range within the
signature help label text to highlight as the current parameter,
but helix uses byte offset ranges for rendering highlights. This
was brought up in the [review of the original signature help PR][1],
but the ranges were being highlighted correctly, and there were no
out of bound or indexing panics. Turns out rust-analyzer was
[incorrectly sending byte offsets] instead of char offsets and this
made it seem like all was well and good with offsets in helix during
initial testing.

[1]: https://github.com/helix-editor/helix/pull/1755#discussion_r906715371
[2]: https://github.com/rust-lang/rust-analyzer/pull/12272
This commit is contained in:
Gokul Soumya 2022-07-22 21:53:08 +05:30 committed by Blaž Hrastnik
parent 14eca318a7
commit a8b123fe17
No known key found for this signature in database
GPG key ID: 1238B9C4AD889640

View file

@ -904,7 +904,12 @@ pub fn signature_help_impl(cx: &mut Context, invoked: SignatureHelpInvoked) {
Some((start, start + string.len())) Some((start, start + string.len()))
} }
lsp::ParameterLabel::LabelOffsets([start, end]) => { lsp::ParameterLabel::LabelOffsets([start, end]) => {
Some((*start as usize, *end as usize)) // LS sends offsets based on utf-16 based string representation
// but highlighting in helix is done using byte offset.
use helix_core::str_utils::char_to_byte_idx;
let from = char_to_byte_idx(&signature.label, *start as usize);
let to = char_to_byte_idx(&signature.label, *end as usize);
Some((from, to))
} }
} }
}; };