fix: consider relative offset to fake ident token in expansion for completion

This commit is contained in:
Ryo Yoshida 2023-01-25 23:47:29 +09:00
parent 3bc33c7e9f
commit 0ec2911857
No known key found for this signature in database
GPG Key ID: E25698A930586171

View File

@ -48,7 +48,9 @@ pub(super) fn expand_and_analyze(
// make the offset point to the start of the original token, as that is what the // make the offset point to the start of the original token, as that is what the
// intermediate offsets calculated in expansion always points to // intermediate offsets calculated in expansion always points to
let offset = offset - relative_offset; let offset = offset - relative_offset;
let expansion = expand(sema, original_file, speculative_file, offset, fake_ident_token); let expansion =
expand(sema, original_file, speculative_file, offset, fake_ident_token, relative_offset);
// add the relative offset back, so that left_biased finds the proper token // add the relative offset back, so that left_biased finds the proper token
let offset = expansion.offset + relative_offset; let offset = expansion.offset + relative_offset;
let token = expansion.original_file.token_at_offset(offset).left_biased()?; let token = expansion.original_file.token_at_offset(offset).left_biased()?;
@ -67,6 +69,7 @@ fn expand(
mut speculative_file: SyntaxNode, mut speculative_file: SyntaxNode,
mut offset: TextSize, mut offset: TextSize,
mut fake_ident_token: SyntaxToken, mut fake_ident_token: SyntaxToken,
relative_offset: TextSize,
) -> ExpansionResult { ) -> ExpansionResult {
let _p = profile::span("CompletionContext::expand"); let _p = profile::span("CompletionContext::expand");
let mut derive_ctx = None; let mut derive_ctx = None;
@ -97,7 +100,7 @@ fn expand(
// successful expansions // successful expansions
(Some(actual_expansion), Some((fake_expansion, fake_mapped_token))) => { (Some(actual_expansion), Some((fake_expansion, fake_mapped_token))) => {
let new_offset = fake_mapped_token.text_range().start(); let new_offset = fake_mapped_token.text_range().start();
if new_offset > actual_expansion.text_range().end() { if new_offset + relative_offset > actual_expansion.text_range().end() {
// offset outside of bounds from the original expansion, // offset outside of bounds from the original expansion,
// stop here to prevent problems from happening // stop here to prevent problems from happening
break 'expansion; break 'expansion;
@ -176,7 +179,7 @@ fn expand(
// successful expansions // successful expansions
(Some(actual_expansion), Some((fake_expansion, fake_mapped_token))) => { (Some(actual_expansion), Some((fake_expansion, fake_mapped_token))) => {
let new_offset = fake_mapped_token.text_range().start(); let new_offset = fake_mapped_token.text_range().start();
if new_offset > actual_expansion.text_range().end() { if new_offset + relative_offset > actual_expansion.text_range().end() {
// offset outside of bounds from the original expansion, // offset outside of bounds from the original expansion,
// stop here to prevent problems from happening // stop here to prevent problems from happening
break 'expansion; break 'expansion;