Skip to content

Commit

Permalink
Auto merge of rust-lang#101862 - cjgillot:lint-regression, r=oli-obk
Browse files Browse the repository at this point in the history
Do not fetch HIR node when iterating to find lint.

Addresses the regression in rust-lang#101620
  • Loading branch information
bors committed Sep 18, 2022
2 parents 5253b0a + c9c6c50 commit bc7b17c
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 9 deletions.
20 changes: 12 additions & 8 deletions compiler/rustc_middle/src/hir/map/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ pub struct ParentHirIterator<'hir> {
}

impl<'hir> Iterator for ParentHirIterator<'hir> {
type Item = (HirId, Node<'hir>);
type Item = HirId;

fn next(&mut self) -> Option<Self::Item> {
if self.current_id == CRATE_HIR_ID {
Expand All @@ -77,10 +77,7 @@ impl<'hir> Iterator for ParentHirIterator<'hir> {
}

self.current_id = parent_id;
if let Some(node) = self.map.find(parent_id) {
return Some((parent_id, node));
}
// If this `HirId` doesn't have an entry, skip it and look for its `parent_id`.
return Some(parent_id);
}
}
}
Expand Down Expand Up @@ -393,8 +390,8 @@ impl<'hir> Map<'hir> {
}

pub fn enclosing_body_owner(self, hir_id: HirId) -> LocalDefId {
for (parent, _) in self.parent_iter(hir_id) {
if let Some(body) = self.find(parent).map(associated_body).flatten() {
for (_, node) in self.parent_iter(hir_id) {
if let Some(body) = associated_body(node) {
return self.body_owner_def_id(body);
}
}
Expand Down Expand Up @@ -635,10 +632,17 @@ impl<'hir> Map<'hir> {
/// Returns an iterator for the nodes in the ancestor tree of the `current_id`
/// until the crate root is reached. Prefer this over your own loop using `get_parent_node`.
#[inline]
pub fn parent_iter(self, current_id: HirId) -> ParentHirIterator<'hir> {
pub fn parent_id_iter(self, current_id: HirId) -> impl Iterator<Item = HirId> + 'hir {
ParentHirIterator { current_id, map: self }
}

/// Returns an iterator for the nodes in the ancestor tree of the `current_id`
/// until the crate root is reached. Prefer this over your own loop using `get_parent_node`.
#[inline]
pub fn parent_iter(self, current_id: HirId) -> impl Iterator<Item = (HirId, Node<'hir>)> {
self.parent_id_iter(current_id).filter_map(move |id| Some((id, self.find(id)?)))
}

/// Returns an iterator for the nodes in the ancestor tree of the `current_id`
/// until the crate root is reached. Prefer this over your own loop using `get_parent_node`.
#[inline]
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_middle/src/lint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ impl ShallowLintLevelMap {
return (Some(level), src);
}

for (parent, _) in tcx.hir().parent_iter(start) {
for parent in tcx.hir().parent_id_iter(start) {
let specs = tcx.shallow_lint_levels_on(parent);
if let Some(&(level, src)) = specs.specs.get(&id) {
return (Some(level), src);
Expand Down

0 comments on commit bc7b17c

Please sign in to comment.