From ebb87fe157fadb09dd70bcfba2c349185b58c923 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 27 Aug 2021 15:10:42 +0200 Subject: [PATCH] Don't use fake text range in original node search as is in completions --- crates/ide_completion/src/patterns.rs | 1 + crates/ide_completion/src/tests.rs | 31 +++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/crates/ide_completion/src/patterns.rs b/crates/ide_completion/src/patterns.rs index bcbd63b43a..6ceef0225a 100644 --- a/crates/ide_completion/src/patterns.rs +++ b/crates/ide_completion/src/patterns.rs @@ -285,6 +285,7 @@ fn maximize_name_ref(name_ref: &ast::NameRef) -> SyntaxNode { } fn find_node_with_range(syntax: &SyntaxNode, range: TextRange) -> Option { + let range = syntax.text_range().intersect(range)?; syntax.covering_element(range).ancestors().find_map(N::cast) } diff --git a/crates/ide_completion/src/tests.rs b/crates/ide_completion/src/tests.rs index b8d60dfd2c..5ef6829a05 100644 --- a/crates/ide_completion/src/tests.rs +++ b/crates/ide_completion/src/tests.rs @@ -75,13 +75,13 @@ pub(crate) const TEST_CONFIG: CompletionConfig = CompletionConfig { }, }; -pub(crate) fn completion_list(code: &str) -> String { - completion_list_with_config(TEST_CONFIG, code) +pub(crate) fn completion_list(ra_fixture: &str) -> String { + completion_list_with_config(TEST_CONFIG, ra_fixture) } -fn completion_list_with_config(config: CompletionConfig, code: &str) -> String { +fn completion_list_with_config(config: CompletionConfig, ra_fixture: &str) -> String { // filter out all but one builtintype completion for smaller test outputs - let items = get_all_items(config, code); + let items = get_all_items(config, ra_fixture); let mut bt_seen = false; let items = items .into_iter() @@ -227,3 +227,26 @@ fn test_no_completions_required() { cov_mark::check!(no_completion_required); check_no_completion(r#"fn foo() { for i i$0 }"#); } + +#[test] +fn regression_10042() { + completion_list( + r#" +macro_rules! preset { + ($($x:ident)&&*) => { + { + let mut v = Vec::new(); + $( + v.push($x.into()); + )* + v + } + }; +} + +fn foo() { + preset!(foo$0); +} +"#, + ); +}