diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2021-01-03 17:09:13 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-03 17:09:13 +0100 |
| commit | 539c435b509563956bc34c3bc457528483f383a0 (patch) | |
| tree | ce64551f02b93942fdf2d4ffeb77f8c605acc961 | |
| parent | ff1f21a8fd19c847afa954c89cff5e356e1a9d8f (diff) | |
| parent | 4d3227fe1c14c089afb6d2bfa266a78336bf4fc1 (diff) | |
| download | rust-539c435b509563956bc34c3bc457528483f383a0.tar.gz rust-539c435b509563956bc34c3bc457528483f383a0.zip | |
Rollup merge of #80646 - bugadani:meta, r=petrochenkov
Clean up in `each_child_of_item` This PR hopes to eliminate some of the surprising elements I encountered while reading the function. - `macros_only` is checked against inside the loop body, but if it is `true`, the loop is skipped anyway - only query `span` when relevant - no need to allocate attribute vector
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/decoder.rs | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/compiler/rustc_metadata/src/rmeta/decoder.rs b/compiler/rustc_metadata/src/rmeta/decoder.rs index 43f7b2a9928..a4bb5f8dc95 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder.rs @@ -1055,19 +1055,15 @@ impl<'a, 'tcx> CrateMetadataRef<'a> { // Iterate over all children. let macros_only = self.dep_kind.lock().macros_only(); - let children = self.root.tables.children.get(self, id).unwrap_or_else(Lazy::empty); - for child_index in children.decode((self, sess)) { - if macros_only { - continue; - } - - // Get the item. - if let Some(child_kind) = self.maybe_kind(child_index) { - match child_kind { - EntryKind::MacroDef(..) => {} - _ if macros_only => continue, - _ => {} - } + if !macros_only { + let children = self.root.tables.children.get(self, id).unwrap_or_else(Lazy::empty); + + for child_index in children.decode((self, sess)) { + // Get the item. + let child_kind = match self.maybe_kind(child_index) { + Some(child_kind) => child_kind, + None => continue, + }; // Hand off the item to the callback. match child_kind { @@ -1102,8 +1098,8 @@ impl<'a, 'tcx> CrateMetadataRef<'a> { } let def_key = self.def_key(child_index); - let span = self.get_span(child_index, sess); if def_key.disambiguated_data.data.get_opt_name().is_some() { + let span = self.get_span(child_index, sess); let kind = self.def_kind(child_index); let ident = self.item_ident(child_index, sess); let vis = self.get_visibility(child_index); @@ -1137,9 +1133,8 @@ impl<'a, 'tcx> CrateMetadataRef<'a> { // within the crate. We only need this for fictive constructors, // for other constructors correct visibilities // were already encoded in metadata. - let attrs: Vec<_> = - self.get_item_attrs(def_id.index, sess).collect(); - if sess.contains_name(&attrs, sym::non_exhaustive) { + let mut attrs = self.get_item_attrs(def_id.index, sess); + if attrs.any(|item| item.has_name(sym::non_exhaustive)) { let crate_def_id = self.local_def_id(CRATE_DEF_INDEX); vis = ty::Visibility::Restricted(crate_def_id); } |
