rustc_resolve: Make macro_rules scope chain compression lazy
This commit is contained in:
@@ -976,9 +976,6 @@ pub struct Resolver<'a> {
|
||||
/// `macro_rules` scopes *produced* by expanding the macro invocations,
|
||||
/// include all the `macro_rules` items and other invocations generated by them.
|
||||
output_macro_rules_scopes: FxHashMap<ExpnId, MacroRulesScopeRef<'a>>,
|
||||
/// References to all `MacroRulesScope::Invocation(invoc_id)`s, used to update such scopes
|
||||
/// when their corresponding `invoc_id`s get expanded.
|
||||
invocation_macro_rules_scopes: FxHashMap<ExpnId, FxHashSet<MacroRulesScopeRef<'a>>>,
|
||||
/// Helper attributes that are in scope for the given expansion.
|
||||
helper_attrs: FxHashMap<ExpnId, Vec<Ident>>,
|
||||
|
||||
@@ -1310,7 +1307,6 @@ impl<'a> Resolver<'a> {
|
||||
non_macro_attrs: [non_macro_attr(false), non_macro_attr(true)],
|
||||
invocation_parent_scopes: Default::default(),
|
||||
output_macro_rules_scopes: Default::default(),
|
||||
invocation_macro_rules_scopes: Default::default(),
|
||||
helper_attrs: Default::default(),
|
||||
local_macro_def_scopes: FxHashMap::default(),
|
||||
name_already_seen: FxHashMap::default(),
|
||||
@@ -1680,7 +1676,20 @@ impl<'a> Resolver<'a> {
|
||||
!(expn_id == parent_scope.expansion && macro_kind == Some(MacroKind::Derive))
|
||||
}
|
||||
Scope::DeriveHelpersCompat => true,
|
||||
Scope::MacroRules(..) => true,
|
||||
Scope::MacroRules(macro_rules_scope) => {
|
||||
// Use "path compression" on `macro_rules` scope chains. This is an optimization
|
||||
// used to avoid long scope chains, see the comments on `MacroRulesScopeRef`.
|
||||
// As another consequence of this optimization visitors never observe invocation
|
||||
// scopes for macros that were already expanded.
|
||||
while let MacroRulesScope::Invocation(invoc_id) = macro_rules_scope.get() {
|
||||
if let Some(next_scope) = self.output_macro_rules_scopes.get(&invoc_id) {
|
||||
macro_rules_scope.set(next_scope.get());
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
true
|
||||
}
|
||||
Scope::CrateRoot => true,
|
||||
Scope::Module(..) => true,
|
||||
Scope::RegisteredAttrs => use_prelude,
|
||||
@@ -1716,11 +1725,9 @@ impl<'a> Resolver<'a> {
|
||||
MacroRulesScope::Binding(binding) => {
|
||||
Scope::MacroRules(binding.parent_macro_rules_scope)
|
||||
}
|
||||
MacroRulesScope::Invocation(invoc_id) => Scope::MacroRules(
|
||||
self.output_macro_rules_scopes.get(&invoc_id).cloned().unwrap_or_else(
|
||||
|| self.invocation_parent_scopes[&invoc_id].macro_rules,
|
||||
),
|
||||
),
|
||||
MacroRulesScope::Invocation(invoc_id) => {
|
||||
Scope::MacroRules(self.invocation_parent_scopes[&invoc_id].macro_rules)
|
||||
}
|
||||
MacroRulesScope::Empty => Scope::Module(module),
|
||||
},
|
||||
Scope::CrateRoot => match ns {
|
||||
|
||||
Reference in New Issue
Block a user