3

Fix off-by-one error converting to LSP UTF8 offsets with multi-byte char by krob...

 3 weeks ago
source link: https://github.com/rust-lang/rust-analyzer/pull/17003
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Conversation

Contributor

On this file,

fn main() {
    let 된장 = 1;
}

when using "positionEncodings":["utf-16"] I get an "unused variable" diagnostic on the variable
name (codepoint offset range 8..10). So far so good.

When using positionEncodings":["utf-8"], I expect to get the equivalent range in bytes (LSP:
"Character offsets count UTF-8 code units (e.g bytes)."), which is 8..14, because both
characters are 3 bytes in UTF-8. However I actually get 10..14.

Looks like this is because we accidentally treat a 1-based index as an offset value: when
converting from our internal char-indices to LSP byte offsets, we look at one character to many.
This causes wrong results if the extra character is a multi-byte one, such as when computing
the start coordinate of 된장.

Fix that by actually passing an offset. While at it, fix the variable name of the line number,
which is not an offset (yet).

Originally reported at kakoune-lsp/kakoune-lsp#740


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK