diff options
| author | bors <bors@rust-lang.org> | 2021-09-03 14:47:13 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-09-03 14:47:13 +0000 |
| commit | 577a76f0031f727735410b99a5cc5f0b61b92eef (patch) | |
| tree | 60f9cfd8627c093755e9637a1f614f66e444b92a /compiler/rustc_resolve/src | |
| parent | c5799b2a73bd03d1d7b4a432fa0a0cb93e7288db (diff) | |
| parent | 5e3cd6a8b29b312c796c5a83afd4a5fa21513f8e (diff) | |
| download | rust-577a76f0031f727735410b99a5cc5f0b61b92eef.tar.gz rust-577a76f0031f727735410b99a5cc5f0b61b92eef.zip | |
Auto merge of #88597 - cjgillot:lower-global, r=petrochenkov
Move global analyses from lowering to resolution Split off https://github.com/rust-lang/rust/pull/87234 r? `@petrochenkov`
Diffstat (limited to 'compiler/rustc_resolve/src')
| -rw-r--r-- | compiler/rustc_resolve/src/late.rs | 24 | ||||
| -rw-r--r-- | compiler/rustc_resolve/src/lib.rs | 25 | ||||
| -rw-r--r-- | compiler/rustc_resolve/src/macros.rs | 4 |
3 files changed, 49 insertions, 4 deletions
diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index 5c7b4b02822..7b65ab2acf6 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(); @@ -1276,7 +1281,14 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { this.with_self_rib(Res::SelfTy(None, None), |this| { // Resolve the trait reference, if necessary. this.with_optional_trait_ref(opt_trait_reference.as_ref(), |this, trait_id| { - let item_def_id = this.r.local_def_id(item_id).to_def_id(); + let item_def_id = this.r.local_def_id(item_id); + + // Register the trait definitions from here. + if let Some(trait_id) = trait_id { + this.r.trait_impls.entry(trait_id).or_default().push(item_def_id); + } + + let item_def_id = item_def_id.to_def_id(); this.with_self_rib(Res::SelfTy(trait_id, Some((item_def_id, false))), |this| { if let Some(trait_ref) = opt_trait_reference.as_ref() { // Resolve type arguments in the trait path. @@ -2463,6 +2475,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..152d34fd635 100644 --- a/compiler/rustc_resolve/src/lib.rs +++ b/compiler/rustc_resolve/src/lib.rs @@ -60,7 +60,7 @@ use rustc_span::{Span, DUMMY_SP}; use smallvec::{smallvec, SmallVec}; use std::cell::{Cell, RefCell}; -use std::collections::BTreeSet; +use std::collections::{BTreeMap, BTreeSet}; use std::ops::ControlFlow; use std::{cmp, fmt, iter, ptr}; use tracing::debug; @@ -1030,8 +1030,14 @@ 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>, + trait_impls: BTreeMap<DefId, Vec<LocalDefId>>, + /// A list of proc macro LocalDefIds, written out in the order in which + /// they are declared in the static array generated by proc_macro_harness. + proc_macros: Vec<NodeId>, } /// Nothing really interesting here; it just provides memory for the rest of the crate. @@ -1109,8 +1115,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,7 +1400,10 @@ 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(), + trait_impls: Default::default(), + proc_macros: Default::default(), }; let root_parent_scope = ParentScope::module(graph_root, &resolver); @@ -1425,6 +1438,7 @@ impl<'a> Resolver<'a> { } pub fn into_outputs(self) -> ResolverOutputs { + let proc_macros = self.proc_macros.iter().map(|id| self.local_def_id(*id)).collect(); let definitions = self.definitions; let visibilities = self.visibilities; let extern_crate_map = self.extern_crate_map; @@ -1448,10 +1462,13 @@ impl<'a> Resolver<'a> { .map(|(ident, entry)| (ident.name, entry.introduced_by_item)) .collect(), main_def, + trait_impls: self.trait_impls, + proc_macros, } } pub fn clone_outputs(&self) -> ResolverOutputs { + let proc_macros = self.proc_macros.iter().map(|id| self.local_def_id(*id)).collect(); ResolverOutputs { definitions: self.definitions.clone(), cstore: Box::new(self.cstore().clone()), @@ -1467,6 +1484,8 @@ impl<'a> Resolver<'a> { .map(|(ident, entry)| (ident.name, entry.introduced_by_item)) .collect(), main_def: self.main_def.clone(), + trait_impls: self.trait_impls.clone(), + proc_macros, } } diff --git a/compiler/rustc_resolve/src/macros.rs b/compiler/rustc_resolve/src/macros.rs index 7f86f891c44..6dc3aa0888a 100644 --- a/compiler/rustc_resolve/src/macros.rs +++ b/compiler/rustc_resolve/src/macros.rs @@ -466,6 +466,10 @@ impl<'a> ResolverExpand for Resolver<'a> { fn get_proc_macro_quoted_span(&self, krate: CrateNum, id: usize) -> Span { self.crate_loader.cstore().get_proc_macro_quoted_span_untracked(krate, id, self.session) } + + fn declare_proc_macro(&mut self, id: NodeId) { + self.proc_macros.push(id) + } } impl<'a> Resolver<'a> { |
