diff options
| author | Maybe Waffle <waffle.lapkin@gmail.com> | 2022-10-06 06:10:28 +0000 |
|---|---|---|
| committer | Maybe Waffle <waffle.lapkin@gmail.com> | 2022-10-06 06:16:39 +0000 |
| commit | a57ef6b0b17b1cbeac14789908b62df6ffef4079 (patch) | |
| tree | 743d0e1ef79ab4cda91bed685a16cec7818eaac5 | |
| parent | 476d0438749e3a5b2669811f9429da79a6628e8a (diff) | |
| download | rust-a57ef6b0b17b1cbeac14789908b62df6ffef4079.tar.gz rust-a57ef6b0b17b1cbeac14789908b62df6ffef4079.zip | |
Fix go-to-def for shadowed `include*!`
| -rw-r--r-- | crates/ide/src/goto_definition.rs | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs index 36a648fe4a8..7d8ef7ab9dc 100644 --- a/crates/ide/src/goto_definition.rs +++ b/crates/ide/src/goto_definition.rs @@ -95,6 +95,14 @@ fn try_lookup_include_path( if !matches!(&*name.text(), "include" | "include_str" | "include_bytes") { return None; } + + // Ignore non-built-in macros to account for shadowing + if let Some(it) = sema.resolve_macro_call(¯o_call) { + if !matches!(it.kind(sema.db), hir::MacroKind::BuiltIn) { + return None; + } + } + let file_id = sema.db.resolve_path(AnchoredPath { anchor: file_id, path: &path })?; let size = sema.db.file_text(file_id).len().try_into().ok()?; Some(NavigationTarget { @@ -156,9 +164,6 @@ mod tests { fn check(ra_fixture: &str) { let (analysis, position, expected) = fixture::annotations(ra_fixture); let navs = analysis.goto_definition(position).unwrap().expect("no definition found").info; - if navs.is_empty() { - panic!("unresolved reference") - } let cmp = |&FileRange { file_id, range }: &_| (file_id, range.start()); let navs = navs @@ -1348,6 +1353,10 @@ fn f(e: Enum) { check( r#" //- /main.rs + +#[rustc_builtin_macro] +macro_rules! include_str {} + fn main() { let str = include_str!("foo.txt$0"); } @@ -1357,6 +1366,24 @@ fn main() { "#, ); } + + #[test] + fn goto_shadow_include() { + check( + r#" +//- /main.rs +macro_rules! include { + ("included.rs") => {} +} + +include!("included.rs$0"); + +//- /included.rs +// empty +"#, + ); + } + #[cfg(test)] mod goto_impl_of_trait_fn { use super::check; |
