about summary refs log tree commit diff
path: root/compiler/rustc_expand/src/expand.rs
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2024-12-31 22:59:22 +0000
committerEsteban Küber <esteban@kuber.com.ar>2025-08-01 22:02:52 +0000
commit4ba4559a9d6974f5789f7e1654d5063941bb8816 (patch)
treea9444926e5963af4a170398df5abec80de1ab7c3 /compiler/rustc_expand/src/expand.rs
parent5210c501bc7320d7cc5e84f77d2c7ca5fca9a2e0 (diff)
downloadrust-4ba4559a9d6974f5789f7e1654d5063941bb8816.tar.gz
rust-4ba4559a9d6974f5789f7e1654d5063941bb8816.zip
remove recursive search for items
Diffstat (limited to 'compiler/rustc_expand/src/expand.rs')
-rw-r--r--compiler/rustc_expand/src/expand.rs48
1 files changed, 15 insertions, 33 deletions
diff --git a/compiler/rustc_expand/src/expand.rs b/compiler/rustc_expand/src/expand.rs
index bae39a65cd9..609e93a685c 100644
--- a/compiler/rustc_expand/src/expand.rs
+++ b/compiler/rustc_expand/src/expand.rs
@@ -1399,44 +1399,26 @@ impl InvocationCollectorNode for P<ast::Item> {
     }
 
     fn declared_idents(&self) -> Vec<Ident> {
-        struct ItemNameVisitor(Vec<Ident>, u8);
-        impl Visitor<'_> for ItemNameVisitor {
-            fn visit_item(&mut self, i: &ast::Item) {
-                self.1 += 1;
-                if let ItemKind::Use(ut) = &i.kind {
-                    fn collect_use_tree_leaves(ut: &ast::UseTree, idents: &mut Vec<Ident>) {
-                        match &ut.kind {
-                            ast::UseTreeKind::Glob => {}
-                            ast::UseTreeKind::Simple(_) => idents.push(ut.ident()),
-                            ast::UseTreeKind::Nested { items, .. } => {
-                                for (ut, _) in items {
-                                    collect_use_tree_leaves(ut, idents);
-                                }
-                            }
+        if let ItemKind::Use(ut) = &self.kind {
+            fn collect_use_tree_leaves(ut: &ast::UseTree, idents: &mut Vec<Ident>) {
+                match &ut.kind {
+                    ast::UseTreeKind::Glob => {}
+                    ast::UseTreeKind::Simple(_) => idents.push(ut.ident()),
+                    ast::UseTreeKind::Nested { items, .. } => {
+                        for (ut, _) in items {
+                            collect_use_tree_leaves(ut, idents);
                         }
                     }
-
-                    collect_use_tree_leaves(ut, &mut self.0);
-                } else {
-                    if let Some(ident) = i.kind.ident() {
-                        self.0.push(ident);
-                    }
-                }
-                if self.1 < 4 {
-                    // We only visit up to 3 levels of nesting from this item, like if we were
-                    // looking at `mod a`, we'd find item `a::b::c`. We have this limit to guard
-                    // against deeply nested modules behind `cfg` flags, where we could spend
-                    // significant time collecting this information purely for a potential
-                    // diagnostic improvement.
-                    visit::walk_item(self, i);
                 }
-                self.1 -= 1;
             }
+            let mut idents = vec![];
+            collect_use_tree_leaves(&ut, &mut idents);
+            idents
+        } else if let Some(ident) = self.kind.ident() {
+            vec![ident]
+        } else {
+            vec![]
         }
-
-        let mut v = ItemNameVisitor(vec![], 0);
-        v.visit_item(self);
-        v.0
     }
 }