Skip to content

Commit 0e22c73

Browse files
committed
Limit how deep we visit items to find cfg'd out names
1 parent 1792fdf commit 0e22c73

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

compiler/rustc_expand/src/expand.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -1260,9 +1260,10 @@ impl InvocationCollectorNode for P<ast::Item> {
12601260
res
12611261
}
12621262
fn declared_names(&self) -> Vec<Ident> {
1263-
struct ItemNameVisitor(Vec<Ident>);
1263+
struct ItemNameVisitor(Vec<Ident>, u8);
12641264
impl Visitor<'_> for ItemNameVisitor {
12651265
fn visit_item(&mut self, i: &ast::Item) {
1266+
self.1 += 1;
12661267
if let ItemKind::Use(ut) = &i.kind {
12671268
fn collect_use_tree_leaves(ut: &ast::UseTree, idents: &mut Vec<Ident>) {
12681269
match &ut.kind {
@@ -1280,11 +1281,19 @@ impl InvocationCollectorNode for P<ast::Item> {
12801281
} else {
12811282
self.0.push(i.ident);
12821283
}
1283-
visit::walk_item(self, i);
1284+
if self.1 < 4 {
1285+
// We only visit up to 3 levels of nesting from this item, like if we were
1286+
// looking at `mod a`, we'd find item `a::b::c`. We have this limit to guard
1287+
// against deeply nested modules behind `cfg` flags, where we could spend
1288+
// significant time collecting this information purely for a potential
1289+
// diagnostic improvement.
1290+
visit::walk_item(self, i);
1291+
}
1292+
self.1 -= 1;
12841293
}
12851294
}
12861295

1287-
let mut v = ItemNameVisitor(vec![]);
1296+
let mut v = ItemNameVisitor(vec![], 0);
12881297
v.visit_item(self);
12891298
v.0
12901299
}

0 commit comments

Comments
 (0)