diff options
| author | Camille GILLOT <gillot.camille@gmail.com> | 2021-07-14 18:04:56 +0200 |
|---|---|---|
| committer | Camille GILLOT <gillot.camille@gmail.com> | 2021-09-01 20:13:16 +0200 |
| commit | 26eeec0bafabb08df96168448f4b64d9fb650b0b (patch) | |
| tree | b9542cc9996a0a326221d722a57011d4a76e264e /compiler | |
| parent | 74fb87e3a0bb88cd3bd9857bedc236bda52a8af7 (diff) | |
| download | rust-26eeec0bafabb08df96168448f4b64d9fb650b0b.tar.gz rust-26eeec0bafabb08df96168448f4b64d9fb650b0b.zip | |
Compute item_generics_num_lifetimes during resolution.
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_ast_lowering/src/lib.rs | 47 | ||||
| -rw-r--r-- | compiler/rustc_ast_lowering/src/path.rs | 11 | ||||
| -rw-r--r-- | compiler/rustc_resolve/src/late.rs | 15 | ||||
| -rw-r--r-- | compiler/rustc_resolve/src/lib.rs | 11 |
4 files changed, 30 insertions, 54 deletions
diff --git a/compiler/rustc_ast_lowering/src/lib.rs b/compiler/rustc_ast_lowering/src/lib.rs index 196d48faf51..5d3a5fc20e0 100644 --- a/compiler/rustc_ast_lowering/src/lib.rs +++ b/compiler/rustc_ast_lowering/src/lib.rs @@ -39,7 +39,6 @@ use rustc_ast::node_id::NodeMap; use rustc_ast::token::{self, Token}; use rustc_ast::tokenstream::{CanSynthesizeMissingTokens, TokenStream, TokenTree}; use rustc_ast::visit::{self, AssocCtxt, Visitor}; -use rustc_ast::walk_list; use rustc_ast::{self as ast, *}; use rustc_ast_pretty::pprust; use rustc_data_structures::captures::Captures; @@ -48,7 +47,7 @@ use rustc_data_structures::sync::Lrc; use rustc_errors::{struct_span_err, Applicability}; use rustc_hir as hir; use rustc_hir::def::{DefKind, Namespace, PartialRes, PerNS, Res}; -use rustc_hir::def_id::{DefId, DefIdMap, DefPathHash, LocalDefId, CRATE_DEF_ID}; +use rustc_hir::def_id::{DefId, DefPathHash, LocalDefId, CRATE_DEF_ID}; use rustc_hir::definitions::{DefKey, DefPathData, Definitions}; use rustc_hir::intravisit; use rustc_hir::{ConstArg, GenericArg, InferKind, ParamName}; @@ -159,8 +158,6 @@ struct LoweringContext<'a, 'hir: 'a> { current_module: LocalDefId, - type_def_lifetime_params: DefIdMap<usize>, - current_hir_id_owner: (LocalDefId, u32), item_local_id_counters: NodeMap<u32>, node_id_to_hir_id: IndexVec<NodeId, Option<hir::HirId>>, @@ -172,7 +169,7 @@ struct LoweringContext<'a, 'hir: 'a> { pub trait ResolverAstLowering { fn def_key(&mut self, id: DefId) -> DefKey; - fn item_generics_num_lifetimes(&self, def: DefId, sess: &Session) -> usize; + fn item_generics_num_lifetimes(&self, def: DefId) -> usize; fn legacy_const_generic_args(&mut self, expr: &Expr) -> Option<Vec<usize>>; @@ -336,7 +333,6 @@ pub fn lower_crate<'a, 'hir>( is_in_trait_impl: false, is_in_dyn_type: false, anonymous_lifetime_mode: AnonymousLifetimeMode::PassThrough, - type_def_lifetime_params: Default::default(), current_module: CRATE_DEF_ID, current_hir_id_owner: (CRATE_DEF_ID, 0), item_local_id_counters: Default::default(), @@ -452,26 +448,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { fn visit_item(&mut self, item: &'tcx Item) { self.lctx.allocate_hir_id_counter(item.id); - match item.kind { - ItemKind::Struct(_, ref generics) - | ItemKind::Union(_, ref generics) - | ItemKind::Enum(_, ref generics) - | ItemKind::TyAlias(box TyAliasKind(_, ref generics, ..)) - | ItemKind::Trait(box TraitKind(_, _, ref generics, ..)) => { - let def_id = self.lctx.resolver.local_def_id(item.id); - let count = generics - .params - .iter() - .filter(|param| { - matches!(param.kind, ast::GenericParamKind::Lifetime { .. }) - }) - .count(); - self.lctx.type_def_lifetime_params.insert(def_id.to_def_id(), count); - } - ItemKind::Use(ref use_tree) => { - self.allocate_use_tree_hir_id_counters(use_tree); - } - _ => {} + if let ItemKind::Use(ref use_tree) = item.kind { + self.allocate_use_tree_hir_id_counters(use_tree); } visit::walk_item(self, item); @@ -486,23 +464,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { self.lctx.allocate_hir_id_counter(item.id); visit::walk_foreign_item(self, item); } - - fn visit_ty(&mut self, t: &'tcx Ty) { - match t.kind { - // Mirrors the case in visit::walk_ty - TyKind::BareFn(ref f) => { - walk_list!(self, visit_generic_param, &f.generic_params); - // Mirrors visit::walk_fn_decl - for parameter in &f.decl.inputs { - // We don't lower the ids of argument patterns - self.visit_pat(¶meter.pat); - self.visit_ty(¶meter.ty) - } - self.visit_fn_ret_ty(&f.decl.output) - } - _ => visit::walk_ty(self, t), - } - } } self.lower_node_id(CRATE_NODE_ID); diff --git a/compiler/rustc_ast_lowering/src/path.rs b/compiler/rustc_ast_lowering/src/path.rs index a11d020c931..90a22b5c209 100644 --- a/compiler/rustc_ast_lowering/src/path.rs +++ b/compiler/rustc_ast_lowering/src/path.rs @@ -90,15 +90,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { _ => ParenthesizedGenericArgs::Err, }; - let num_lifetimes = type_def_id.map_or(0, |def_id| { - if let Some(&n) = self.type_def_lifetime_params.get(&def_id) { - return n; - } - assert!(!def_id.is_local()); - let n = self.resolver.item_generics_num_lifetimes(def_id, self.sess); - self.type_def_lifetime_params.insert(def_id, n); - n - }); + let num_lifetimes = type_def_id + .map_or(0, |def_id| self.resolver.item_generics_num_lifetimes(def_id)); self.lower_path_segment( p.span, segment, diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index 5c7b4b02822..4a0287d83ff 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -952,6 +952,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { match item.kind { ItemKind::TyAlias(box TyAliasKind(_, ref generics, _, _)) | ItemKind::Fn(box FnKind(_, _, ref generics, _)) => { + self.compute_num_lifetime_params(item.id, generics); self.with_generic_param_rib(generics, ItemRibKind(HasGenericParams::Yes), |this| { visit::walk_item(this, item) }); @@ -960,6 +961,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { ItemKind::Enum(_, ref generics) | ItemKind::Struct(_, ref generics) | ItemKind::Union(_, ref generics) => { + self.compute_num_lifetime_params(item.id, generics); self.resolve_adt(item, generics); } @@ -970,10 +972,12 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { items: ref impl_items, .. }) => { + self.compute_num_lifetime_params(item.id, generics); self.resolve_implementation(generics, of_trait, &self_ty, item.id, impl_items); } ItemKind::Trait(box TraitKind(.., ref generics, ref bounds, ref trait_items)) => { + self.compute_num_lifetime_params(item.id, generics); // Create a new rib for the trait-wide type parameters. self.with_generic_param_rib(generics, ItemRibKind(HasGenericParams::Yes), |this| { let local_def_id = this.r.local_def_id(item.id).to_def_id(); @@ -1025,6 +1029,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { } ItemKind::TraitAlias(ref generics, ref bounds) => { + self.compute_num_lifetime_params(item.id, generics); // Create a new rib for the trait-wide type parameters. self.with_generic_param_rib(generics, ItemRibKind(HasGenericParams::Yes), |this| { let local_def_id = this.r.local_def_id(item.id).to_def_id(); @@ -2463,6 +2468,16 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { Some((ident.name, ns)), ) } + + fn compute_num_lifetime_params(&mut self, id: NodeId, generics: &Generics) { + let def_id = self.r.local_def_id(id); + let count = generics + .params + .iter() + .filter(|param| matches!(param.kind, ast::GenericParamKind::Lifetime { .. })) + .count(); + self.r.item_generics_num_lifetimes.insert(def_id, count); + } } impl<'a> Resolver<'a> { diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs index da3beac0819..2101381553b 100644 --- a/compiler/rustc_resolve/src/lib.rs +++ b/compiler/rustc_resolve/src/lib.rs @@ -1030,6 +1030,8 @@ pub struct Resolver<'a> { trait_impl_items: FxHashSet<LocalDefId>, legacy_const_generic_args: FxHashMap<DefId, Option<Vec<usize>>>, + /// Amount of lifetime parameters for each item in the crate. + item_generics_num_lifetimes: FxHashMap<LocalDefId, usize>, main_def: Option<MainDefinition>, } @@ -1109,8 +1111,12 @@ impl ResolverAstLowering for Resolver<'_> { } } - fn item_generics_num_lifetimes(&self, def_id: DefId, sess: &Session) -> usize { - self.cstore().item_generics_num_lifetimes(def_id, sess) + fn item_generics_num_lifetimes(&self, def_id: DefId) -> usize { + if let Some(def_id) = def_id.as_local() { + self.item_generics_num_lifetimes[&def_id] + } else { + self.cstore().item_generics_num_lifetimes(def_id, self.session) + } } fn legacy_const_generic_args(&mut self, expr: &Expr) -> Option<Vec<usize>> { @@ -1390,6 +1396,7 @@ impl<'a> Resolver<'a> { next_disambiguator: Default::default(), trait_impl_items: Default::default(), legacy_const_generic_args: Default::default(), + item_generics_num_lifetimes: Default::default(), main_def: Default::default(), }; |
