]> git.lizzy.rs Git - rust.git/commitdiff
Set up a search scope when searching for mbe macro references
authorLukas Wirth <lukastw97@gmail.com>
Sun, 21 Mar 2021 19:08:08 +0000 (20:08 +0100)
committerLukas Wirth <lukastw97@gmail.com>
Tue, 23 Mar 2021 10:32:10 +0000 (11:32 +0100)
crates/hir/src/lib.rs
crates/ide/src/references.rs
crates/ide_db/src/search.rs

index 68f4551c0cfc7536942cb8d2eab680ab08de7567..ea0a609612309b63de3a097123ae6fa144ecd18b 100644 (file)
@@ -1150,6 +1150,11 @@ pub fn is_derive_macro(&self) -> bool {
         // FIXME: wrong for `ProcMacro`
         matches!(self.id.kind, MacroDefKind::ProcMacro(..) | MacroDefKind::BuiltInDerive(..))
     }
+
+    /// Indicate it is a declarative macro
+    pub fn is_declarative(&self) -> bool {
+        matches!(self.id.kind, MacroDefKind::Declarative(..))
+    }
 }
 
 /// Invariant: `inner.as_assoc_item(db).is_some()`
index 3796745306633c6877b5ee384c7e74cabb409dd1..95ed8a0457e1342b543ed4b0c81dfe72d732cfed 100644 (file)
@@ -1294,4 +1294,34 @@ fn test_transitive() {
             "#]],
         );
     }
+
+    #[test]
+    fn test_decl_macro_references() {
+        check(
+            r#"
+//- /lib.rs crate:lib
+#[macro_use]
+mod qux;
+mod bar;
+
+pub use self::foo;
+//- /qux.rs
+#[macro_export]
+macro_rules! foo$0 {
+    () => {struct Foo;};
+}
+//- /bar.rs
+foo!();
+//- /other.rs crate:other deps:lib new_source_root:
+lib::foo!();
+"#,
+            expect![[r#"
+                foo Macro FileId(1) 0..61 29..32
+
+                FileId(0) 46..49
+                FileId(2) 0..3
+                FileId(3) 5..8
+            "#]],
+        );
+    }
 }
index 8e93de277e91c74f9e0daf5fe9f83da57440e0e0..5fdcb13cfb9a07ae0caa4dbd20167720246c06db 100644 (file)
@@ -7,7 +7,7 @@
 use std::{convert::TryInto, mem};
 
 use base_db::{FileId, FileRange, SourceDatabase, SourceDatabaseExt};
-use hir::{DefWithBody, HasSource, Module, ModuleSource, Semantics, Visibility};
+use hir::{DefWithBody, HasAttrs, HasSource, Module, ModuleSource, Semantics, Visibility};
 use once_cell::unsync::Lazy;
 use rustc_hash::FxHashMap;
 use syntax::{ast, match_ast, AstNode, TextRange, TextSize};
@@ -244,9 +244,8 @@ fn search_scope(&self, db: &RootDatabase) -> SearchScope {
             return SearchScope::new(res);
         }
 
-        if let Some(Visibility::Public) = vis {
+        let rev_dep_scope = || {
             let mut res = FxHashMap::default();
-
             let krate = module.krate();
             for rev_dep in krate.transitive_reverse_dependencies(db) {
                 let root_file = rev_dep.root_file(db);
@@ -254,7 +253,25 @@ fn search_scope(&self, db: &RootDatabase) -> SearchScope {
                 let source_root = db.source_root(source_root_id);
                 res.extend(source_root.iter().map(|id| (id, None)));
             }
-            return SearchScope::new(res);
+            SearchScope::new(res)
+        };
+
+        if let Definition::Macro(macro_def) = self {
+            if macro_def.is_declarative() {
+                return if macro_def.attrs(db).by_key("macro_export").exists() {
+                    rev_dep_scope()
+                } else {
+                    let source_root_id = db.file_source_root(file_id);
+                    let source_root = db.source_root(source_root_id);
+                    SearchScope::new(
+                        source_root.iter().map(|id| (id, None)).collect::<FxHashMap<_, _>>(),
+                    )
+                };
+            }
+        }
+
+        if let Some(Visibility::Public) = vis {
+            return rev_dep_scope();
         }
 
         let mut res = FxHashMap::default();