Move some methods from tcx.hir() to tcx

Renamings:
- find -> opt_hir_node
- get -> hir_node
- find_by_def_id -> opt_hir_node_by_def_id
- get_by_def_id -> hir_node_by_def_id

Fix rebase changes using removed methods

Use `tcx.hir_node_by_def_id()` whenever possible in compiler

Fix clippy errors

Fix compiler

Apply suggestions from code review

Co-authored-by: Vadim Petrochenkov <vadim.petrochenkov@gmail.com>

Add FIXME for `tcx.hir()` returned type about its removal

Simplify with with `tcx.hir_node_by_def_id`
This commit is contained in:
zetanumbers 2023-12-01 05:28:34 -08:00
parent 27d8a57713
commit 24f009c5e5
122 changed files with 390 additions and 393 deletions

View File

@ -18,7 +18,7 @@ use rustc_middle::mir::{
PlaceRef, ProjectionElem, Rvalue, Statement, StatementKind, Terminator, TerminatorKind, PlaceRef, ProjectionElem, Rvalue, Statement, StatementKind, Terminator, TerminatorKind,
VarBindingForm, VarBindingForm,
}; };
use rustc_middle::ty::{self, suggest_constraining_type_params, PredicateKind, Ty}; use rustc_middle::ty::{self, suggest_constraining_type_params, PredicateKind, Ty, TyCtxt};
use rustc_middle::util::CallKind; use rustc_middle::util::CallKind;
use rustc_mir_dataflow::move_paths::{InitKind, MoveOutIndex, MovePathIndex}; use rustc_mir_dataflow::move_paths::{InitKind, MoveOutIndex, MovePathIndex};
use rustc_span::def_id::LocalDefId; use rustc_span::def_id::LocalDefId;
@ -398,7 +398,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
} }
let typeck = self.infcx.tcx.typeck(self.mir_def_id()); let typeck = self.infcx.tcx.typeck(self.mir_def_id());
let hir_id = hir.parent_id(expr.hir_id); let hir_id = hir.parent_id(expr.hir_id);
if let Some(parent) = hir.find(hir_id) { if let Some(parent) = self.infcx.tcx.opt_hir_node(hir_id) {
let (def_id, args, offset) = if let hir::Node::Expr(parent_expr) = parent let (def_id, args, offset) = if let hir::Node::Expr(parent_expr) = parent
&& let hir::ExprKind::MethodCall(_, _, args, _) = parent_expr.kind && let hir::ExprKind::MethodCall(_, _, args, _) = parent_expr.kind
&& let Some(def_id) = typeck.type_dependent_def_id(parent_expr.hir_id) && let Some(def_id) = typeck.type_dependent_def_id(parent_expr.hir_id)
@ -413,7 +413,10 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
(None, &[][..], 0) (None, &[][..], 0)
}; };
if let Some(def_id) = def_id if let Some(def_id) = def_id
&& let Some(node) = hir.find(self.infcx.tcx.local_def_id_to_hir_id(def_id)) && let Some(node) = self
.infcx
.tcx
.opt_hir_node(self.infcx.tcx.local_def_id_to_hir_id(def_id))
&& let Some(fn_sig) = node.fn_sig() && let Some(fn_sig) = node.fn_sig()
&& let Some(ident) = node.ident() && let Some(ident) = node.ident()
&& let Some(pos) = args.iter().position(|arg| arg.hir_id == expr.hir_id) && let Some(pos) = args.iter().position(|arg| arg.hir_id == expr.hir_id)
@ -1317,7 +1320,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
let tcx = self.infcx.tcx; let tcx = self.infcx.tcx;
let hir = tcx.hir(); let hir = tcx.hir();
let Some(body_id) = hir.get(self.mir_hir_id()).body_id() else { return }; let Some(body_id) = tcx.hir_node(self.mir_hir_id()).body_id() else { return };
let typeck_results = tcx.typeck(self.mir_def_id()); let typeck_results = tcx.typeck(self.mir_def_id());
struct ExprFinder<'hir> { struct ExprFinder<'hir> {
@ -1509,7 +1512,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
let local_ty = self.body.local_decls[local].ty; let local_ty = self.body.local_decls[local].ty;
// Get the body the error happens in // Get the body the error happens in
let Some(body_id) = hir.get(self.mir_hir_id()).body_id() else { return }; let Some(body_id) = tcx.hir_node(self.mir_hir_id()).body_id() else { return };
let body_expr = hir.body(body_id).value; let body_expr = hir.body(body_id).value;
@ -1558,7 +1561,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
// Check that the parent of the closure is a method call, // Check that the parent of the closure is a method call,
// with receiver matching with local's type (modulo refs) // with receiver matching with local's type (modulo refs)
let parent = hir.parent_id(closure_expr.hir_id); let parent = hir.parent_id(closure_expr.hir_id);
if let hir::Node::Expr(parent) = hir.get(parent) { if let hir::Node::Expr(parent) = tcx.hir_node(parent) {
if let hir::ExprKind::MethodCall(_, recv, ..) = parent.kind { if let hir::ExprKind::MethodCall(_, recv, ..) = parent.kind {
let recv_ty = typeck_results.expr_ty(recv); let recv_ty = typeck_results.expr_ty(recv);
@ -1635,15 +1638,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
issued_spans: &UseSpans<'tcx>, issued_spans: &UseSpans<'tcx>,
) { ) {
let UseSpans::ClosureUse { capture_kind_span, .. } = issued_spans else { return }; let UseSpans::ClosureUse { capture_kind_span, .. } = issued_spans else { return };
let hir = self.infcx.tcx.hir();
struct ExpressionFinder<'hir> { struct ExpressionFinder<'tcx> {
capture_span: Span, capture_span: Span,
closure_change_spans: Vec<Span>, closure_change_spans: Vec<Span>,
closure_arg_span: Option<Span>, closure_arg_span: Option<Span>,
in_closure: bool, in_closure: bool,
suggest_arg: String, suggest_arg: String,
hir: rustc_middle::hir::map::Map<'hir>, tcx: TyCtxt<'tcx>,
closure_local_id: Option<hir::HirId>, closure_local_id: Option<hir::HirId>,
closure_call_changes: Vec<(Span, String)>, closure_call_changes: Vec<(Span, String)>,
} }
@ -1657,7 +1659,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
fn_decl: hir::FnDecl { inputs, .. }, fn_decl: hir::FnDecl { inputs, .. },
.. ..
}) = e.kind }) = e.kind
&& let Some(hir::Node::Expr(body)) = self.hir.find(body.hir_id) && let Some(hir::Node::Expr(body)) = self.tcx.opt_hir_node(body.hir_id)
{ {
self.suggest_arg = "this: &Self".to_string(); self.suggest_arg = "this: &Self".to_string();
if inputs.len() > 0 { if inputs.len() > 0 {
@ -1722,8 +1724,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
if let Some(hir::Node::ImplItem(hir::ImplItem { if let Some(hir::Node::ImplItem(hir::ImplItem {
kind: hir::ImplItemKind::Fn(_fn_sig, body_id), kind: hir::ImplItemKind::Fn(_fn_sig, body_id),
.. ..
})) = hir.find(self.mir_hir_id()) })) = self.infcx.tcx.opt_hir_node(self.mir_hir_id())
&& let Some(hir::Node::Expr(expr)) = hir.find(body_id.hir_id) && let Some(hir::Node::Expr(expr)) = self.infcx.tcx.opt_hir_node(body_id.hir_id)
{ {
let mut finder = ExpressionFinder { let mut finder = ExpressionFinder {
capture_span: *capture_kind_span, capture_span: *capture_kind_span,
@ -1733,7 +1735,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
suggest_arg: String::new(), suggest_arg: String::new(),
closure_local_id: None, closure_local_id: None,
closure_call_changes: vec![], closure_call_changes: vec![],
hir, tcx: self.infcx.tcx,
}; };
finder.visit_expr(expr); finder.visit_expr(expr);
@ -2294,7 +2296,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
let proper_span = proper_span.source_callsite(); let proper_span = proper_span.source_callsite();
if let Some(scope) = self.body.source_scopes.get(source_info.scope) if let Some(scope) = self.body.source_scopes.get(source_info.scope)
&& let ClearCrossCrate::Set(scope_data) = &scope.local_data && let ClearCrossCrate::Set(scope_data) = &scope.local_data
&& let Some(node) = self.infcx.tcx.hir().find(scope_data.lint_root) && let Some(node) = self.infcx.tcx.opt_hir_node(scope_data.lint_root)
&& let Some(id) = node.body_id() && let Some(id) = node.body_id()
&& let hir::ExprKind::Block(block, _) = self.infcx.tcx.hir().body(id).value.kind && let hir::ExprKind::Block(block, _) = self.infcx.tcx.hir().body(id).value.kind
{ {

View File

@ -87,7 +87,7 @@ impl<'tcx> BorrowExplanation<'tcx> {
if let hir::ExprKind::Path(hir::QPath::Resolved(None, p)) = expr.kind if let hir::ExprKind::Path(hir::QPath::Resolved(None, p)) = expr.kind
&& let [hir::PathSegment { ident, args: None, .. }] = p.segments && let [hir::PathSegment { ident, args: None, .. }] = p.segments
&& let hir::def::Res::Local(hir_id) = p.res && let hir::def::Res::Local(hir_id) = p.res
&& let Some(hir::Node::Pat(pat)) = tcx.hir().find(hir_id) && let Some(hir::Node::Pat(pat)) = tcx.opt_hir_node(hir_id)
{ {
err.span_label(pat.span, format!("binding `{ident}` declared here")); err.span_label(pat.span, format!("binding `{ident}` declared here"));
} }

View File

@ -396,7 +396,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
let upvar_hir_id = captured_place.get_root_variable(); let upvar_hir_id = captured_place.get_root_variable();
if let Some(Node::Pat(pat)) = self.infcx.tcx.hir().find(upvar_hir_id) if let Some(Node::Pat(pat)) = self.infcx.tcx.opt_hir_node(upvar_hir_id)
&& let hir::PatKind::Binding(hir::BindingAnnotation::NONE, _, upvar_ident, _) = && let hir::PatKind::Binding(hir::BindingAnnotation::NONE, _, upvar_ident, _) =
pat.kind pat.kind
{ {
@ -661,7 +661,6 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
if self.body.local_kind(local) != LocalKind::Arg { if self.body.local_kind(local) != LocalKind::Arg {
return (false, None); return (false, None);
} }
let hir_map = self.infcx.tcx.hir();
let my_def = self.body.source.def_id(); let my_def = self.body.source.def_id();
let my_hir = self.infcx.tcx.local_def_id_to_hir_id(my_def.as_local().unwrap()); let my_hir = self.infcx.tcx.local_def_id_to_hir_id(my_def.as_local().unwrap());
let Some(td) = let Some(td) =
@ -671,7 +670,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
}; };
( (
true, true,
td.as_local().and_then(|tld| match hir_map.find_by_def_id(tld) { td.as_local().and_then(|tld| match self.infcx.tcx.opt_hir_node_by_def_id(tld) {
Some(Node::Item(hir::Item { Some(Node::Item(hir::Item {
kind: hir::ItemKind::Trait(_, _, _, _, items), kind: hir::ItemKind::Trait(_, _, _, _, items),
.. ..
@ -682,13 +681,14 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
if !matches!(k, hir::AssocItemKind::Fn { .. }) { if !matches!(k, hir::AssocItemKind::Fn { .. }) {
continue; continue;
} }
if hir_map.name(hi) != hir_map.name(my_hir) { if self.infcx.tcx.hir().name(hi) != self.infcx.tcx.hir().name(my_hir) {
continue; continue;
} }
f_in_trait_opt = Some(hi); f_in_trait_opt = Some(hi);
break; break;
} }
f_in_trait_opt.and_then(|f_in_trait| match hir_map.find(f_in_trait) { f_in_trait_opt.and_then(|f_in_trait| {
match self.infcx.tcx.opt_hir_node(f_in_trait) {
Some(Node::TraitItem(hir::TraitItem { Some(Node::TraitItem(hir::TraitItem {
kind: kind:
hir::TraitItemKind::Fn( hir::TraitItemKind::Fn(
@ -701,6 +701,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
Some(span) Some(span)
} }
_ => None, _ => None,
}
}) })
} }
_ => None, _ => None,
@ -741,12 +742,11 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
} }
} }
let hir_map = self.infcx.tcx.hir();
let def_id = self.body.source.def_id(); let def_id = self.body.source.def_id();
let hir_id = if let Some(local_def_id) = def_id.as_local() let hir_id = if let Some(local_def_id) = def_id.as_local()
&& let Some(body_id) = hir_map.maybe_body_owned_by(local_def_id) && let Some(body_id) = self.infcx.tcx.hir().maybe_body_owned_by(local_def_id)
{ {
let body = hir_map.body(body_id); let body = self.infcx.tcx.hir().body(body_id);
let mut v = BindingFinder { span: pat_span, hir_id: None }; let mut v = BindingFinder { span: pat_span, hir_id: None };
v.visit_body(body); v.visit_body(body);
v.hir_id v.hir_id
@ -762,7 +762,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
&& let Some(hir::Node::Local(hir::Local { && let Some(hir::Node::Local(hir::Local {
pat: hir::Pat { kind: hir::PatKind::Ref(_, _), .. }, pat: hir::Pat { kind: hir::PatKind::Ref(_, _), .. },
.. ..
})) = hir_map.find(hir_id) })) = self.infcx.tcx.opt_hir_node(hir_id)
&& let Ok(name) = && let Ok(name) =
self.infcx.tcx.sess.source_map().span_to_snippet(local_decl.source_info.span) self.infcx.tcx.sess.source_map().span_to_snippet(local_decl.source_info.span)
{ {
@ -942,7 +942,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
let closure_id = self.mir_hir_id(); let closure_id = self.mir_hir_id();
let closure_span = self.infcx.tcx.def_span(self.mir_def_id()); let closure_span = self.infcx.tcx.def_span(self.mir_def_id());
let fn_call_id = hir.parent_id(closure_id); let fn_call_id = hir.parent_id(closure_id);
let node = hir.get(fn_call_id); let node = self.infcx.tcx.hir_node(fn_call_id);
let def_id = hir.enclosing_body_owner(fn_call_id); let def_id = hir.enclosing_body_owner(fn_call_id);
let mut look_at_return = true; let mut look_at_return = true;
// If we can detect the expression to be an `fn` call where the closure was an argument, // If we can detect the expression to be an `fn` call where the closure was an argument,
@ -1001,7 +1001,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
if look_at_return && hir.get_return_block(closure_id).is_some() { if look_at_return && hir.get_return_block(closure_id).is_some() {
// ...otherwise we are probably in the tail expression of the function, point at the // ...otherwise we are probably in the tail expression of the function, point at the
// return type. // return type.
match hir.get_by_def_id(hir.get_parent_item(fn_call_id).def_id) { match self.infcx.tcx.hir_node_by_def_id(hir.get_parent_item(fn_call_id).def_id) {
hir::Node::Item(hir::Item { ident, kind: hir::ItemKind::Fn(sig, ..), .. }) hir::Node::Item(hir::Item { ident, kind: hir::ItemKind::Fn(sig, ..), .. })
| hir::Node::TraitItem(hir::TraitItem { | hir::Node::TraitItem(hir::TraitItem {
ident, ident,
@ -1199,12 +1199,11 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
hir::intravisit::walk_stmt(self, s); hir::intravisit::walk_stmt(self, s);
} }
} }
let hir_map = self.infcx.tcx.hir();
let def_id = self.body.source.def_id(); let def_id = self.body.source.def_id();
let hir_id = if let Some(local_def_id) = def_id.as_local() let hir_id = if let Some(local_def_id) = def_id.as_local()
&& let Some(body_id) = hir_map.maybe_body_owned_by(local_def_id) && let Some(body_id) = self.infcx.tcx.hir().maybe_body_owned_by(local_def_id)
{ {
let body = hir_map.body(body_id); let body = self.infcx.tcx.hir().body(body_id);
let mut v = BindingFinder { span: err_label_span, hir_id: None }; let mut v = BindingFinder { span: err_label_span, hir_id: None };
v.visit_body(body); v.visit_body(body);
v.hir_id v.hir_id
@ -1213,7 +1212,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
}; };
if let Some(hir_id) = hir_id if let Some(hir_id) = hir_id
&& let Some(hir::Node::Local(local)) = hir_map.find(hir_id) && let Some(hir::Node::Local(local)) = self.infcx.tcx.opt_hir_node(hir_id)
{ {
let tables = self.infcx.tcx.typeck(def_id.as_local().unwrap()); let tables = self.infcx.tcx.typeck(def_id.as_local().unwrap());
if let Some(clone_trait) = self.infcx.tcx.lang_items().clone_trait() if let Some(clone_trait) = self.infcx.tcx.lang_items().clone_trait()
@ -1496,7 +1495,7 @@ fn get_mut_span_in_struct_field<'tcx>(
&& let ty::Adt(def, _) = ty.kind() && let ty::Adt(def, _) = ty.kind()
&& let field = def.all_fields().nth(field.index())? && let field = def.all_fields().nth(field.index())?
// Use the HIR types to construct the diagnostic message. // Use the HIR types to construct the diagnostic message.
&& let node = tcx.hir().find_by_def_id(field.did.as_local()?)? && let node = tcx.opt_hir_node_by_def_id(field.did.as_local()?)?
// Now we're dealing with the actual struct that we're going to suggest a change to, // Now we're dealing with the actual struct that we're going to suggest a change to,
// we can expect a field that is an immutable reference to a type. // we can expect a field that is an immutable reference to a type.
&& let hir::Node::Field(field) = node && let hir::Node::Field(field) = node

View File

@ -672,7 +672,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
let mir_hir_id = self.mir_hir_id(); let mir_hir_id = self.mir_hir_id();
let (return_span, mir_description, hir_ty) = match hir.get(mir_hir_id) { let (return_span, mir_description, hir_ty) = match tcx.hir_node(mir_hir_id) {
hir::Node::Expr(hir::Expr { hir::Node::Expr(hir::Expr {
kind: hir::ExprKind::Closure(&hir::Closure { fn_decl, body, fn_decl_span, .. }), kind: hir::ExprKind::Closure(&hir::Closure { fn_decl, body, fn_decl_span, .. }),
.. ..
@ -689,7 +689,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
hir::CoroutineSource::Closure => " of async closure", hir::CoroutineSource::Closure => " of async closure",
hir::CoroutineSource::Fn => { hir::CoroutineSource::Fn => {
let parent_item = let parent_item =
hir.get_by_def_id(hir.get_parent_item(mir_hir_id).def_id); tcx.hir_node_by_def_id(hir.get_parent_item(mir_hir_id).def_id);
let output = &parent_item let output = &parent_item
.fn_decl() .fn_decl()
.expect("coroutine lowered from async fn should be in fn") .expect("coroutine lowered from async fn should be in fn")
@ -706,7 +706,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
hir::CoroutineSource::Closure => " of gen closure", hir::CoroutineSource::Closure => " of gen closure",
hir::CoroutineSource::Fn => { hir::CoroutineSource::Fn => {
let parent_item = let parent_item =
hir.get_by_def_id(hir.get_parent_item(mir_hir_id).def_id); tcx.hir_node_by_def_id(hir.get_parent_item(mir_hir_id).def_id);
let output = &parent_item let output = &parent_item
.fn_decl() .fn_decl()
.expect("coroutine lowered from gen fn should be in fn") .expect("coroutine lowered from gen fn should be in fn")
@ -721,7 +721,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
hir::CoroutineSource::Closure => " of async gen closure", hir::CoroutineSource::Closure => " of async gen closure",
hir::CoroutineSource::Fn => { hir::CoroutineSource::Fn => {
let parent_item = let parent_item =
hir.get_by_def_id(hir.get_parent_item(mir_hir_id).def_id); tcx.hir_node_by_def_id(hir.get_parent_item(mir_hir_id).def_id);
let output = &parent_item let output = &parent_item
.fn_decl() .fn_decl()
.expect("coroutine lowered from async gen fn should be in fn") .expect("coroutine lowered from async gen fn should be in fn")
@ -841,7 +841,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
let type_name = let type_name =
self.infcx.extract_inference_diagnostics_data(yield_ty.into(), Some(highlight)).name; self.infcx.extract_inference_diagnostics_data(yield_ty.into(), Some(highlight)).name;
let yield_span = match tcx.hir().get(self.mir_hir_id()) { let yield_span = match tcx.hir_node(self.mir_hir_id()) {
hir::Node::Expr(hir::Expr { hir::Node::Expr(hir::Expr {
kind: hir::ExprKind::Closure(&hir::Closure { fn_decl_span, .. }), kind: hir::ExprKind::Closure(&hir::Closure { fn_decl_span, .. }),
.. ..

View File

@ -33,7 +33,7 @@ pub fn is_parent_const_impl_raw(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
/// return if it has a `const` modifier. If it is an intrinsic, report whether said intrinsic /// return if it has a `const` modifier. If it is an intrinsic, report whether said intrinsic
/// has a `rustc_const_{un,}stable` attribute. Otherwise, return `Constness::NotConst`. /// has a `rustc_const_{un,}stable` attribute. Otherwise, return `Constness::NotConst`.
fn constness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::Constness { fn constness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::Constness {
let node = tcx.hir().get_by_def_id(def_id); let node = tcx.hir_node_by_def_id(def_id);
match node { match node {
hir::Node::Ctor(_) hir::Node::Ctor(_)

View File

@ -227,7 +227,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
// Sometimes the index is beyond the number of upvars (seen // Sometimes the index is beyond the number of upvars (seen
// for a coroutine). // for a coroutine).
let var_hir_id = captured_place.get_root_variable(); let var_hir_id = captured_place.get_root_variable();
let node = self.ecx.tcx.hir().get(var_hir_id); let node = self.ecx.tcx.hir_node(var_hir_id);
if let hir::Node::Pat(pat) = node { if let hir::Node::Pat(pat) = node {
if let hir::PatKind::Binding(_, _, ident, _) = pat.kind { if let hir::PatKind::Binding(_, _, ident, _) = pat.kind {
name = Some(ident.name); name = Some(ident.name);

View File

@ -119,8 +119,7 @@ impl<'tcx> NonConstOp<'tcx> for FnCallNonConst<'tcx> {
match self_ty.kind() { match self_ty.kind() {
Param(param_ty) => { Param(param_ty) => {
debug!(?param_ty); debug!(?param_ty);
let caller_hir_id = tcx.local_def_id_to_hir_id(caller); if let Some(generics) = tcx.hir_node_by_def_id(caller).generics() {
if let Some(generics) = tcx.hir().get(caller_hir_id).generics() {
let constraint = with_no_trimmed_paths!(format!( let constraint = with_no_trimmed_paths!(format!(
"~const {}", "~const {}",
trait_ref.print_only_trait_path() trait_ref.print_only_trait_path()

View File

@ -24,7 +24,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
.. ..
}), }),
.. ..
}) = tcx.hir().get_by_def_id(parent_id) }) = tcx.hir_node_by_def_id(parent_id)
&& self_ty.hir_id == impl_self_ty.hir_id && self_ty.hir_id == impl_self_ty.hir_id
{ {
if !of_trait_ref.trait_def_id().is_some_and(|def_id| def_id.is_local()) { if !of_trait_ref.trait_def_id().is_some_and(|def_id| def_id.is_local()) {

View File

@ -2715,7 +2715,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
let hir = tcx.hir(); let hir = tcx.hir();
let hir::Node::ImplItem(hir::ImplItem { kind: hir::ImplItemKind::Fn(..), ident, .. }) = let hir::Node::ImplItem(hir::ImplItem { kind: hir::ImplItemKind::Fn(..), ident, .. }) =
hir.get(fn_hir_id) tcx.hir_node(fn_hir_id)
else { else {
return None; return None;
}; };

View File

@ -504,7 +504,7 @@ fn check_item_type(tcx: TyCtxt<'_>, id: hir::ItemId) {
let origin = tcx.opaque_type_origin(id.owner_id.def_id); let origin = tcx.opaque_type_origin(id.owner_id.def_id);
if let hir::OpaqueTyOrigin::FnReturn(fn_def_id) if let hir::OpaqueTyOrigin::FnReturn(fn_def_id)
| hir::OpaqueTyOrigin::AsyncFn(fn_def_id) = origin | hir::OpaqueTyOrigin::AsyncFn(fn_def_id) = origin
&& let hir::Node::TraitItem(trait_item) = tcx.hir().get_by_def_id(fn_def_id) && let hir::Node::TraitItem(trait_item) = tcx.hir_node_by_def_id(fn_def_id)
&& let (_, hir::TraitFn::Required(..)) = trait_item.expect_fn() && let (_, hir::TraitFn::Required(..)) = trait_item.expect_fn()
{ {
// Skip opaques from RPIT in traits with no default body. // Skip opaques from RPIT in traits with no default body.
@ -1173,7 +1173,7 @@ fn detect_discriminant_duplicate<'tcx>(tcx: TyCtxt<'tcx>, adt: ty::AdtDef<'tcx>)
ty::VariantDiscr::Explicit(discr_def_id) => { ty::VariantDiscr::Explicit(discr_def_id) => {
// In the case the discriminant is both a duplicate and overflowed, let the user know // In the case the discriminant is both a duplicate and overflowed, let the user know
if let hir::Node::AnonConst(expr) = if let hir::Node::AnonConst(expr) =
tcx.hir().get_by_def_id(discr_def_id.expect_local()) tcx.hir_node_by_def_id(discr_def_id.expect_local())
&& let hir::ExprKind::Lit(lit) = &tcx.hir().body(expr.body).value.kind && let hir::ExprKind::Lit(lit) = &tcx.hir().body(expr.body).value.kind
&& let rustc_ast::LitKind::Int(lit_value, _int_kind) = &lit.node && let rustc_ast::LitKind::Int(lit_value, _int_kind) = &lit.node
&& *lit_value != dis.val && *lit_value != dis.val

View File

@ -2181,7 +2181,7 @@ pub(super) fn check_type_bounds<'tcx>(
let impl_ty_span = if impl_ty.is_impl_trait_in_trait() { let impl_ty_span = if impl_ty.is_impl_trait_in_trait() {
tcx.def_span(impl_ty_def_id) tcx.def_span(impl_ty_def_id)
} else { } else {
match tcx.hir().get_by_def_id(impl_ty_def_id) { match tcx.hir_node_by_def_id(impl_ty_def_id) {
hir::Node::TraitItem(hir::TraitItem { hir::Node::TraitItem(hir::TraitItem {
kind: hir::TraitItemKind::Type(_, Some(ty)), kind: hir::TraitItemKind::Type(_, Some(ty)),
.. ..

View File

@ -278,7 +278,7 @@ fn report_mismatched_rpitit_signature<'tcx>(
} }
let (span, impl_return_span, pre, post) = let (span, impl_return_span, pre, post) =
match tcx.hir().get_by_def_id(impl_m_def_id.expect_local()).fn_decl().unwrap().output { match tcx.hir_node_by_def_id(impl_m_def_id.expect_local()).fn_decl().unwrap().output {
hir::FnRetTy::DefaultReturn(span) => (tcx.def_span(impl_m_def_id), span, "-> ", " "), hir::FnRetTy::DefaultReturn(span) => (tcx.def_span(impl_m_def_id), span, "-> ", " "),
hir::FnRetTy::Return(ty) => (ty.span, ty.span, "", ""), hir::FnRetTy::Return(ty) => (ty.span, ty.span, "", ""),
}; };

View File

@ -43,7 +43,7 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: DefId) {
return None; return None;
} }
let hir_id = tcx.local_def_id_to_hir_id(def_id.expect_local()); let hir_id = tcx.local_def_id_to_hir_id(def_id.expect_local());
match tcx.hir().find(hir_id) { match tcx.opt_hir_node(hir_id) {
Some(Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, generics, _), .. })) => { Some(Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, generics, _), .. })) => {
generics.params.is_empty().not().then_some(generics.span) generics.params.is_empty().not().then_some(generics.span)
} }
@ -58,7 +58,7 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: DefId) {
return None; return None;
} }
let hir_id = tcx.local_def_id_to_hir_id(def_id.expect_local()); let hir_id = tcx.local_def_id_to_hir_id(def_id.expect_local());
match tcx.hir().find(hir_id) { match tcx.opt_hir_node(hir_id) {
Some(Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, generics, _), .. })) => { Some(Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, generics, _), .. })) => {
Some(generics.where_clause_span) Some(generics.where_clause_span)
} }
@ -80,7 +80,7 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: DefId) {
return None; return None;
} }
let hir_id = tcx.local_def_id_to_hir_id(def_id.expect_local()); let hir_id = tcx.local_def_id_to_hir_id(def_id.expect_local());
match tcx.hir().find(hir_id) { match tcx.opt_hir_node(hir_id) {
Some(Node::Item(hir::Item { kind: hir::ItemKind::Fn(fn_sig, _, _), .. })) => { Some(Node::Item(hir::Item { kind: hir::ItemKind::Fn(fn_sig, _, _), .. })) => {
Some(fn_sig.decl.output.span()) Some(fn_sig.decl.output.span())
} }
@ -199,7 +199,7 @@ fn check_start_fn_ty(tcx: TyCtxt<'_>, start_def_id: DefId) {
let start_t = tcx.type_of(start_def_id).instantiate_identity(); let start_t = tcx.type_of(start_def_id).instantiate_identity();
match start_t.kind() { match start_t.kind() {
ty::FnDef(..) => { ty::FnDef(..) => {
if let Some(Node::Item(it)) = tcx.hir().find(start_id) { if let Some(Node::Item(it)) = tcx.opt_hir_node(start_id) {
if let hir::ItemKind::Fn(sig, generics, _) = &it.kind { if let hir::ItemKind::Fn(sig, generics, _) = &it.kind {
let mut error = false; let mut error = false;
if !generics.params.is_empty() { if !generics.params.is_empty() {

View File

@ -130,7 +130,7 @@ fn get_owner_return_paths(
) -> Option<(LocalDefId, ReturnsVisitor<'_>)> { ) -> Option<(LocalDefId, ReturnsVisitor<'_>)> {
let hir_id = tcx.local_def_id_to_hir_id(def_id); let hir_id = tcx.local_def_id_to_hir_id(def_id);
let parent_id = tcx.hir().get_parent_item(hir_id).def_id; let parent_id = tcx.hir().get_parent_item(hir_id).def_id;
tcx.hir().find_by_def_id(parent_id).and_then(|node| node.body_id()).map(|body_id| { tcx.opt_hir_node_by_def_id(parent_id).and_then(|node| node.body_id()).map(|body_id| {
let body = tcx.hir().body(body_id); let body = tcx.hir().body(body_id);
let mut visitor = ReturnsVisitor::default(); let mut visitor = ReturnsVisitor::default();
visitor.visit_body(body); visitor.visit_body(body);

View File

@ -793,7 +793,7 @@ fn could_be_self(trait_def_id: LocalDefId, ty: &hir::Ty<'_>) -> bool {
/// When this is done, suggest using `Self` instead. /// When this is done, suggest using `Self` instead.
fn check_object_unsafe_self_trait_by_name(tcx: TyCtxt<'_>, item: &hir::TraitItem<'_>) { fn check_object_unsafe_self_trait_by_name(tcx: TyCtxt<'_>, item: &hir::TraitItem<'_>) {
let (trait_name, trait_def_id) = let (trait_name, trait_def_id) =
match tcx.hir().get_by_def_id(tcx.hir().get_parent_item(item.hir_id()).def_id) { match tcx.hir_node_by_def_id(tcx.hir().get_parent_item(item.hir_id()).def_id) {
hir::Node::Item(item) => match item.kind { hir::Node::Item(item) => match item.kind {
hir::ItemKind::Trait(..) => (item.ident, item.owner_id), hir::ItemKind::Trait(..) => (item.ident, item.owner_id),
_ => return, _ => return,
@ -1019,7 +1019,7 @@ fn check_type_defn<'tcx>(
for field in &variant.fields { for field in &variant.fields {
let field_id = field.did.expect_local(); let field_id = field.did.expect_local();
let hir::FieldDef { ty: hir_ty, .. } = let hir::FieldDef { ty: hir_ty, .. } =
tcx.hir().get_by_def_id(field_id).expect_field(); tcx.hir_node_by_def_id(field_id).expect_field();
let ty = wfcx.normalize( let ty = wfcx.normalize(
hir_ty.span, hir_ty.span,
None, None,
@ -1057,7 +1057,7 @@ fn check_type_defn<'tcx>(
let last = idx == variant.fields.len() - 1; let last = idx == variant.fields.len() - 1;
let field_id = field.did.expect_local(); let field_id = field.did.expect_local();
let hir::FieldDef { ty: hir_ty, .. } = let hir::FieldDef { ty: hir_ty, .. } =
tcx.hir().get_by_def_id(field_id).expect_field(); tcx.hir_node_by_def_id(field_id).expect_field();
let ty = wfcx.normalize( let ty = wfcx.normalize(
hir_ty.span, hir_ty.span,
None, None,
@ -1882,7 +1882,7 @@ impl<'tcx> WfCheckingCtxt<'_, 'tcx> {
// Match the existing behavior. // Match the existing behavior.
if pred.is_global() && !pred.has_type_flags(TypeFlags::HAS_BINDER_VARS) { if pred.is_global() && !pred.has_type_flags(TypeFlags::HAS_BINDER_VARS) {
let pred = self.normalize(span, None, pred); let pred = self.normalize(span, None, pred);
let hir_node = tcx.hir().find_by_def_id(self.body_def_id); let hir_node = tcx.opt_hir_node_by_def_id(self.body_def_id);
// only use the span of the predicate clause (#90869) // only use the span of the predicate clause (#90869)

View File

@ -221,7 +221,7 @@ pub(crate) fn placeholder_type_error_diag<'tcx>(
// Check if parent is const or static // Check if parent is const or static
let parent_id = tcx.hir().parent_id(hir_ty.hir_id); let parent_id = tcx.hir().parent_id(hir_ty.hir_id);
let parent_node = tcx.hir().get(parent_id); let parent_node = tcx.hir_node(parent_id);
is_const_or_static = matches!( is_const_or_static = matches!(
parent_node, parent_node,
@ -354,7 +354,7 @@ impl<'tcx> ItemCtxt<'tcx> {
} }
pub fn node(&self) -> hir::Node<'tcx> { pub fn node(&self) -> hir::Node<'tcx> {
self.tcx.hir().get(self.hir_id()) self.tcx.hir_node(self.hir_id())
} }
} }
@ -835,8 +835,7 @@ fn convert_variant(
fn adt_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::AdtDef<'_> { fn adt_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::AdtDef<'_> {
use rustc_hir::*; use rustc_hir::*;
let hir_id = tcx.local_def_id_to_hir_id(def_id); let Node::Item(item) = tcx.hir_node_by_def_id(def_id) else {
let Node::Item(item) = tcx.hir().get(hir_id) else {
bug!(); bug!();
}; };
@ -1105,7 +1104,7 @@ fn fn_sig(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<ty::PolyFnSig<
let icx = ItemCtxt::new(tcx, def_id); let icx = ItemCtxt::new(tcx, def_id);
let output = match tcx.hir().get(hir_id) { let output = match tcx.hir_node(hir_id) {
TraitItem(hir::TraitItem { TraitItem(hir::TraitItem {
kind: TraitItemKind::Fn(sig, TraitFn::Provided(_)), kind: TraitItemKind::Fn(sig, TraitFn::Provided(_)),
generics, generics,
@ -1551,7 +1550,7 @@ fn compute_sig_of_foreign_fn_decl<'tcx>(
} }
fn coroutine_kind(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<hir::CoroutineKind> { fn coroutine_kind(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<hir::CoroutineKind> {
match tcx.hir().get_by_def_id(def_id) { match tcx.hir_node_by_def_id(def_id) {
Node::Expr(&rustc_hir::Expr { Node::Expr(&rustc_hir::Expr {
kind: rustc_hir::ExprKind::Closure(&rustc_hir::Closure { body, .. }), kind: rustc_hir::ExprKind::Closure(&rustc_hir::Closure { body, .. }),
.. ..
@ -1561,7 +1560,7 @@ fn coroutine_kind(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<hir::CoroutineK
} }
fn is_type_alias_impl_trait<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> bool { fn is_type_alias_impl_trait<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> bool {
match tcx.hir().get_by_def_id(def_id) { match tcx.hir_node_by_def_id(def_id) {
Node::Item(hir::Item { kind: hir::ItemKind::OpaqueTy(opaque), .. }) => { Node::Item(hir::Item { kind: hir::ItemKind::OpaqueTy(opaque), .. }) => {
matches!(opaque.origin, hir::OpaqueTyOrigin::TyAlias { .. }) matches!(opaque.origin, hir::OpaqueTyOrigin::TyAlias { .. })
} }

View File

@ -16,7 +16,7 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Generics {
let hir_id = tcx.local_def_id_to_hir_id(def_id); let hir_id = tcx.local_def_id_to_hir_id(def_id);
let node = tcx.hir().get(hir_id); let node = tcx.hir_node(hir_id);
let parent_def_id = match node { let parent_def_id = match node {
Node::ImplItem(_) Node::ImplItem(_)
| Node::TraitItem(_) | Node::TraitItem(_)

View File

@ -86,7 +86,7 @@ pub(super) fn explicit_item_bounds(
// RPITIT's bounds are the same as opaque type bounds, but with // RPITIT's bounds are the same as opaque type bounds, but with
// a projection self type. // a projection self type.
Some(ty::ImplTraitInTraitData::Trait { opaque_def_id, .. }) => { Some(ty::ImplTraitInTraitData::Trait { opaque_def_id, .. }) => {
let item = tcx.hir().get_by_def_id(opaque_def_id.expect_local()).expect_item(); let item = tcx.hir_node_by_def_id(opaque_def_id.expect_local()).expect_item();
let opaque_ty = item.expect_opaque_ty(); let opaque_ty = item.expect_opaque_ty();
return ty::EarlyBinder::bind(opaque_type_bounds( return ty::EarlyBinder::bind(opaque_type_bounds(
tcx, tcx,
@ -105,8 +105,7 @@ pub(super) fn explicit_item_bounds(
None => {} None => {}
} }
let hir_id = tcx.local_def_id_to_hir_id(def_id); let bounds = match tcx.hir_node_by_def_id(def_id) {
let bounds = match tcx.hir().get(hir_id) {
hir::Node::TraitItem(hir::TraitItem { hir::Node::TraitItem(hir::TraitItem {
kind: hir::TraitItemKind::Type(bounds, _), kind: hir::TraitItemKind::Type(bounds, _),
span, span,

View File

@ -135,7 +135,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
} }
let hir_id = tcx.local_def_id_to_hir_id(def_id); let hir_id = tcx.local_def_id_to_hir_id(def_id);
let node = tcx.hir().get(hir_id); let node = tcx.hir_node(hir_id);
let mut is_trait = None; let mut is_trait = None;
let mut is_default_impl_trait = None; let mut is_default_impl_trait = None;
@ -337,7 +337,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
// and the duplicated parameter, to ensure that they do not get out of sync. // and the duplicated parameter, to ensure that they do not get out of sync.
if let Node::Item(&Item { kind: ItemKind::OpaqueTy(..), .. }) = node { if let Node::Item(&Item { kind: ItemKind::OpaqueTy(..), .. }) = node {
let opaque_ty_id = tcx.hir().parent_id(hir_id); let opaque_ty_id = tcx.hir().parent_id(hir_id);
let opaque_ty_node = tcx.hir().get(opaque_ty_id); let opaque_ty_node = tcx.hir_node(opaque_ty_id);
let Node::Ty(&Ty { kind: TyKind::OpaqueDef(_, lifetimes, _), .. }) = opaque_ty_node else { let Node::Ty(&Ty { kind: TyKind::OpaqueDef(_, lifetimes, _), .. }) = opaque_ty_node else {
bug!("unexpected {opaque_ty_node:?}") bug!("unexpected {opaque_ty_node:?}")
}; };
@ -413,7 +413,7 @@ fn const_evaluatable_predicates_of(
} }
let hir_id = tcx.local_def_id_to_hir_id(def_id); let hir_id = tcx.local_def_id_to_hir_id(def_id);
let node = tcx.hir().get(hir_id); let node = tcx.hir_node(hir_id);
let mut collector = ConstCollector { tcx, preds: FxIndexSet::default() }; let mut collector = ConstCollector { tcx, preds: FxIndexSet::default() };
if let hir::Node::Item(item) = node if let hir::Node::Item(item) = node
@ -633,7 +633,7 @@ pub(super) fn implied_predicates_with_filter(
let trait_hir_id = tcx.local_def_id_to_hir_id(trait_def_id); let trait_hir_id = tcx.local_def_id_to_hir_id(trait_def_id);
let Node::Item(item) = tcx.hir().get(trait_hir_id) else { let Node::Item(item) = tcx.hir_node(trait_hir_id) else {
bug!("trait_node_id {} is not an item", trait_hir_id); bug!("trait_node_id {} is not an item", trait_hir_id);
}; };
@ -713,7 +713,7 @@ pub(super) fn type_param_predicates(
let mut extend = None; let mut extend = None;
let item_hir_id = tcx.local_def_id_to_hir_id(item_def_id); let item_hir_id = tcx.local_def_id_to_hir_id(item_def_id);
let ast_generics = match tcx.hir().get(item_hir_id) { let ast_generics = match tcx.hir_node(item_hir_id) {
Node::TraitItem(item) => item.generics, Node::TraitItem(item) => item.generics,
Node::ImplItem(item) => item.generics, Node::ImplItem(item) => item.generics,

View File

@ -748,7 +748,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
} }
if let hir::Node::Item(hir::Item { if let hir::Node::Item(hir::Item {
kind: hir::ItemKind::OpaqueTy { .. }, .. kind: hir::ItemKind::OpaqueTy { .. }, ..
}) = self.tcx.hir().get(parent_id) }) = self.tcx.hir_node(parent_id)
{ {
let mut err = self.tcx.sess.struct_span_err( let mut err = self.tcx.sess.struct_span_err(
lifetime.ident.span, lifetime.ident.span,
@ -1004,7 +1004,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
fn object_lifetime_default(tcx: TyCtxt<'_>, param_def_id: LocalDefId) -> ObjectLifetimeDefault { fn object_lifetime_default(tcx: TyCtxt<'_>, param_def_id: LocalDefId) -> ObjectLifetimeDefault {
debug_assert_eq!(tcx.def_kind(param_def_id), DefKind::TyParam); debug_assert_eq!(tcx.def_kind(param_def_id), DefKind::TyParam);
let hir::Node::GenericParam(param) = tcx.hir().get_by_def_id(param_def_id) else { let hir::Node::GenericParam(param) = tcx.hir_node_by_def_id(param_def_id) else {
bug!("expected GenericParam for object_lifetime_default"); bug!("expected GenericParam for object_lifetime_default");
}; };
match param.source { match param.source {
@ -1305,7 +1305,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
def = ResolvedArg::Error(guar); def = ResolvedArg::Error(guar);
} else if let Some(body_id) = outermost_body { } else if let Some(body_id) = outermost_body {
let fn_id = self.tcx.hir().body_owner(body_id); let fn_id = self.tcx.hir().body_owner(body_id);
match self.tcx.hir().get(fn_id) { match self.tcx.hir_node(fn_id) {
Node::Item(hir::Item { owner_id, kind: hir::ItemKind::Fn(..), .. }) Node::Item(hir::Item { owner_id, kind: hir::ItemKind::Fn(..), .. })
| Node::TraitItem(hir::TraitItem { | Node::TraitItem(hir::TraitItem {
owner_id, owner_id,
@ -2122,7 +2122,7 @@ pub fn deny_non_region_late_bound(
let mut first = true; let mut first = true;
for (var, arg) in bound_vars { for (var, arg) in bound_vars {
let Node::GenericParam(param) = tcx.hir().get_by_def_id(*var) else { let Node::GenericParam(param) = tcx.hir_node_by_def_id(*var) else {
bug!(); bug!();
}; };

View File

@ -20,10 +20,10 @@ fn anon_const_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx> {
use rustc_middle::ty::Ty; use rustc_middle::ty::Ty;
let hir_id = tcx.local_def_id_to_hir_id(def_id); let hir_id = tcx.local_def_id_to_hir_id(def_id);
let Node::AnonConst(_) = tcx.hir().get(hir_id) else { panic!() }; let Node::AnonConst(_) = tcx.hir_node(hir_id) else { panic!() };
let parent_node_id = tcx.hir().parent_id(hir_id); let parent_node_id = tcx.hir().parent_id(hir_id);
let parent_node = tcx.hir().get(parent_node_id); let parent_node = tcx.hir_node(parent_node_id);
let (generics, arg_idx) = match parent_node { let (generics, arg_idx) = match parent_node {
// Easy case: arrays repeat expressions. // Easy case: arrays repeat expressions.
@ -61,7 +61,7 @@ fn anon_const_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx> {
} }
Node::TypeBinding(binding @ &TypeBinding { hir_id: binding_id, .. }) Node::TypeBinding(binding @ &TypeBinding { hir_id: binding_id, .. })
if let Node::TraitRef(trait_ref) = tcx.hir().get(tcx.hir().parent_id(binding_id)) => if let Node::TraitRef(trait_ref) = tcx.hir_node(tcx.hir().parent_id(binding_id)) =>
{ {
let Some(trait_def_id) = trait_ref.trait_def_id() else { let Some(trait_def_id) = trait_ref.trait_def_id() else {
return Ty::new_error_with_message( return Ty::new_error_with_message(
@ -354,7 +354,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty
let icx = ItemCtxt::new(tcx, def_id); let icx = ItemCtxt::new(tcx, def_id);
let output = match tcx.hir().get(hir_id) { let output = match tcx.hir_node(hir_id) {
Node::TraitItem(item) => match item.kind { Node::TraitItem(item) => match item.kind {
TraitItemKind::Fn(..) => { TraitItemKind::Fn(..) => {
let args = ty::GenericArgs::identity_for_item(tcx, def_id); let args = ty::GenericArgs::identity_for_item(tcx, def_id);
@ -517,8 +517,7 @@ pub(super) fn type_of_opaque(
if let Some(def_id) = def_id.as_local() { if let Some(def_id) = def_id.as_local() {
use rustc_hir::*; use rustc_hir::*;
let hir_id = tcx.local_def_id_to_hir_id(def_id); Ok(ty::EarlyBinder::bind(match tcx.hir_node_by_def_id(def_id) {
Ok(ty::EarlyBinder::bind(match tcx.hir().get(hir_id) {
Node::Item(item) => match item.kind { Node::Item(item) => match item.kind {
ItemKind::OpaqueTy(OpaqueTy { ItemKind::OpaqueTy(OpaqueTy {
origin: hir::OpaqueTyOrigin::TyAlias { .. }, origin: hir::OpaqueTyOrigin::TyAlias { .. },

View File

@ -50,8 +50,8 @@ pub(super) fn find_opaque_ty_constraints_for_tait(tcx: TyCtxt<'_>, def_id: Local
if scope == hir::CRATE_HIR_ID { if scope == hir::CRATE_HIR_ID {
tcx.hir().walk_toplevel_module(&mut locator); tcx.hir().walk_toplevel_module(&mut locator);
} else { } else {
trace!("scope={:#?}", tcx.hir().get(scope)); trace!("scope={:#?}", tcx.hir_node(scope));
match tcx.hir().get(scope) { match tcx.hir_node(scope) {
// We explicitly call `visit_*` methods, instead of using `intravisit::walk_*` methods // We explicitly call `visit_*` methods, instead of using `intravisit::walk_*` methods
// This allows our visitor to process the defining item itself, causing // This allows our visitor to process the defining item itself, causing
// it to pick up any 'sibling' defining uses. // it to pick up any 'sibling' defining uses.
@ -95,7 +95,7 @@ pub(super) fn find_opaque_ty_constraints_for_tait(tcx: TyCtxt<'_>, def_id: Local
let reported = tcx.sess.emit_err(UnconstrainedOpaqueType { let reported = tcx.sess.emit_err(UnconstrainedOpaqueType {
span: tcx.def_span(def_id), span: tcx.def_span(def_id),
name: tcx.item_name(parent_def_id.to_def_id()), name: tcx.item_name(parent_def_id.to_def_id()),
what: match tcx.hir().get(scope) { what: match tcx.hir_node(scope) {
_ if scope == hir::CRATE_HIR_ID => "module", _ if scope == hir::CRATE_HIR_ID => "module",
Node::Item(hir::Item { kind: hir::ItemKind::Mod(_), .. }) => "module", Node::Item(hir::Item { kind: hir::ItemKind::Mod(_), .. }) => "module",
Node::Item(hir::Item { kind: hir::ItemKind::Impl(_), .. }) => "impl", Node::Item(hir::Item { kind: hir::ItemKind::Impl(_), .. }) => "impl",
@ -282,7 +282,7 @@ pub(super) fn find_opaque_ty_constraints_for_rpit<'tcx>(
debug!(?scope); debug!(?scope);
let mut locator = RpitConstraintChecker { def_id, tcx, found: mir_opaque_ty }; let mut locator = RpitConstraintChecker { def_id, tcx, found: mir_opaque_ty };
match tcx.hir().get(scope) { match tcx.hir_node(scope) {
Node::Item(it) => intravisit::walk_item(&mut locator, it), Node::Item(it) => intravisit::walk_item(&mut locator, it),
Node::ImplItem(it) => intravisit::walk_impl_item(&mut locator, it), Node::ImplItem(it) => intravisit::walk_impl_item(&mut locator, it),
Node::TraitItem(it) => intravisit::walk_trait_item(&mut locator, it), Node::TraitItem(it) => intravisit::walk_trait_item(&mut locator, it),

View File

@ -122,7 +122,7 @@ fn diagnostic_hir_wf_check<'tcx>(
// We will walk 'into' this type to try to find // We will walk 'into' this type to try to find
// a more precise span for our predicate. // a more precise span for our predicate.
let tys = match loc { let tys = match loc {
WellFormedLoc::Ty(_) => match hir.get(hir_id) { WellFormedLoc::Ty(_) => match tcx.hir_node(hir_id) {
hir::Node::ImplItem(item) => match item.kind { hir::Node::ImplItem(item) => match item.kind {
hir::ImplItemKind::Type(ty) => vec![ty], hir::ImplItemKind::Type(ty) => vec![ty],
hir::ImplItemKind::Const(ty, _) => vec![ty], hir::ImplItemKind::Const(ty, _) => vec![ty],

View File

@ -41,7 +41,7 @@ fn inferred_outlives_of(tcx: TyCtxt<'_>, item_def_id: LocalDefId) -> &[(ty::Clau
} }
} }
match tcx.hir().get(id) { match tcx.hir_node(id) {
Node::Item(item) => match item.kind { Node::Item(item) => match item.kind {
hir::ItemKind::Struct(..) | hir::ItemKind::Enum(..) | hir::ItemKind::Union(..) => { hir::ItemKind::Struct(..) | hir::ItemKind::Enum(..) | hir::ItemKind::Union(..) => {
let crate_map = tcx.inferred_outlives_crate(()); let crate_map = tcx.inferred_outlives_crate(());

View File

@ -137,10 +137,9 @@ impl<'a, 'tcx> WrongNumberOfGenericArgs<'a, 'tcx> {
// is from the 'of_trait' field of the enclosing impl // is from the 'of_trait' field of the enclosing impl
let parent = self.tcx.hir().get_parent(self.path_segment.hir_id); let parent = self.tcx.hir().get_parent(self.path_segment.hir_id);
let parent_item = self let parent_item = self.tcx.hir_node_by_def_id(
.tcx self.tcx.hir().get_parent_item(self.path_segment.hir_id).def_id,
.hir() );
.get_by_def_id(self.tcx.hir().get_parent_item(self.path_segment.hir_id).def_id);
// Get the HIR id of the trait ref // Get the HIR id of the trait ref
let hir::Node::TraitRef(hir::TraitRef { hir_ref_id: trait_ref_id, .. }) = parent else { let hir::Node::TraitRef(hir::TraitRef { hir_ref_id: trait_ref_id, .. }) = parent else {
@ -774,7 +773,7 @@ impl<'a, 'tcx> WrongNumberOfGenericArgs<'a, 'tcx> {
); );
if let Some(parent_node) = self.tcx.hir().opt_parent_id(self.path_segment.hir_id) if let Some(parent_node) = self.tcx.hir().opt_parent_id(self.path_segment.hir_id)
&& let Some(parent_node) = self.tcx.hir().find(parent_node) && let Some(parent_node) = self.tcx.opt_hir_node(parent_node)
&& let hir::Node::Expr(expr) = parent_node && let hir::Node::Expr(expr) = parent_node
{ {
match &expr.kind { match &expr.kind {

View File

@ -238,8 +238,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
// Next, make sure that we have no type expectation. // Next, make sure that we have no type expectation.
let Some(ret) = hir let Some(ret) = self
.find_by_def_id(self.body_id) .tcx
.opt_hir_node_by_def_id(self.body_id)
.and_then(|owner| owner.fn_decl()) .and_then(|owner| owner.fn_decl())
.map(|decl| decl.output.span()) .map(|decl| decl.output.span())
else { else {
@ -317,7 +318,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
hir_id: hir::HirId, hir_id: hir::HirId,
sp: Span, sp: Span,
) -> Option<(Span, String)> { ) -> Option<(Span, String)> {
let node = self.tcx.hir().get(hir_id); let node = self.tcx.hir_node(hir_id);
if let hir::Node::Block(block) = node { if let hir::Node::Block(block) = node {
// check that the body's parent is an fn // check that the body's parent is an fn
let parent = self.tcx.hir().get_parent(self.tcx.hir().parent_id(block.hir_id)); let parent = self.tcx.hir().get_parent(self.tcx.hir().parent_id(block.hir_id));

View File

@ -295,7 +295,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
) { ) {
let hir = self.tcx.hir(); let hir = self.tcx.hir();
let parent_hir_id = hir.parent_id(hir_id); let parent_hir_id = hir.parent_id(hir_id);
let parent_node = hir.get(parent_hir_id); let parent_node = self.tcx.hir_node(parent_hir_id);
if let ( if let (
hir::Node::Expr(hir::Expr { hir::Node::Expr(hir::Expr {
kind: hir::ExprKind::Closure(&hir::Closure { fn_decl_span, body, .. }), kind: hir::ExprKind::Closure(&hir::Closure { fn_decl_span, body, .. }),
@ -313,7 +313,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
if let hir::Node::Expr(hir::Expr { if let hir::Node::Expr(hir::Expr {
kind: hir::ExprKind::Closure(&hir::Closure { fn_decl_span, .. }), kind: hir::ExprKind::Closure(&hir::Closure { fn_decl_span, .. }),
.. ..
}) = hir.get(async_closure) }) = self.tcx.hir_node(async_closure)
{ {
fn_decl_span fn_decl_span
} else { } else {
@ -343,7 +343,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
callee_expr: &'tcx hir::Expr<'tcx>, callee_expr: &'tcx hir::Expr<'tcx>,
) -> bool { ) -> bool {
let hir_id = self.tcx.hir().parent_id(call_expr.hir_id); let hir_id = self.tcx.hir().parent_id(call_expr.hir_id);
let parent_node = self.tcx.hir().get(hir_id); let parent_node = self.tcx.hir_node(hir_id);
if let ( if let (
hir::Node::Expr(hir::Expr { kind: hir::ExprKind::Array(_), .. }), hir::Node::Expr(hir::Expr { kind: hir::ExprKind::Array(_), .. }),
hir::ExprKind::Tup(exp), hir::ExprKind::Tup(exp),

View File

@ -483,8 +483,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
body: &hir::Body<'_>, body: &hir::Body<'_>,
expected_sig: ExpectedSig<'tcx>, expected_sig: ExpectedSig<'tcx>,
) -> ClosureSignatures<'tcx> { ) -> ClosureSignatures<'tcx> {
let hir = self.tcx.hir(); let expr_map_node = self.tcx.hir_node_by_def_id(expr_def_id);
let expr_map_node = hir.get_by_def_id(expr_def_id);
let expected_args: Vec<_> = expected_sig let expected_args: Vec<_> = expected_sig
.sig .sig
.skip_binder() .skip_binder()

View File

@ -1694,7 +1694,7 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> {
let ret_msg = "return a value for the case when the loop has zero elements to iterate on"; let ret_msg = "return a value for the case when the loop has zero elements to iterate on";
let ret_ty_msg = let ret_ty_msg =
"otherwise consider changing the return type to account for that possibility"; "otherwise consider changing the return type to account for that possibility";
if let Some(node) = hir.find(item.into()) if let Some(node) = tcx.opt_hir_node(item.into())
&& let Some(body_id) = node.body_id() && let Some(body_id) = node.body_id()
&& let Some(sig) = node.fn_sig() && let Some(sig) = node.fn_sig()
&& let hir::ExprKind::Block(block, _) = hir.body(body_id).value.kind && let hir::ExprKind::Block(block, _) = hir.body(body_id).value.kind
@ -1776,7 +1776,7 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> {
let mut err = fcx.err_ctxt().report_mismatched_types(cause, expected, found, ty_err); let mut err = fcx.err_ctxt().report_mismatched_types(cause, expected, found, ty_err);
let parent_id = fcx.tcx.hir().parent_id(id); let parent_id = fcx.tcx.hir().parent_id(id);
let parent = fcx.tcx.hir().get(parent_id); let parent = fcx.tcx.hir_node(parent_id);
if let Some(expr) = expression if let Some(expr) = expression
&& let hir::Node::Expr(hir::Expr { && let hir::Node::Expr(hir::Expr {
kind: hir::ExprKind::Closure(&hir::Closure { body, .. }), kind: hir::ExprKind::Closure(&hir::Closure { body, .. }),
@ -1835,7 +1835,7 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> {
} }
let parent_id = fcx.tcx.hir().get_parent_item(id); let parent_id = fcx.tcx.hir().get_parent_item(id);
let parent_item = fcx.tcx.hir().get_by_def_id(parent_id.def_id); let parent_item = fcx.tcx.hir_node_by_def_id(parent_id.def_id);
if let (Some(expr), Some(_), Some((fn_id, fn_decl, _, _))) = if let (Some(expr), Some(_), Some((fn_id, fn_decl, _, _))) =
(expression, blk_id, fcx.get_node_fn_decl(parent_item)) (expression, blk_id, fcx.get_node_fn_decl(parent_item))

View File

@ -289,7 +289,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let hir::def::Res::Local(local_hir_id) = p.res else { let hir::def::Res::Local(local_hir_id) = p.res else {
return false; return false;
}; };
let hir::Node::Pat(pat) = hir.get(local_hir_id) else { let hir::Node::Pat(pat) = self.tcx.hir_node(local_hir_id) else {
return false; return false;
}; };
let (init_ty_hir_id, init) = match hir.get_parent(pat.hir_id) { let (init_ty_hir_id, init) = match hir.get_parent(pat.hir_id) {
@ -557,7 +557,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
hir::Node::Stmt(hir::Stmt { kind: hir::StmtKind::Semi(&ref p), .. }) hir::Node::Stmt(hir::Stmt { kind: hir::StmtKind::Semi(&ref p), .. })
| hir::Node::Block(hir::Block { expr: Some(&ref p), .. }) | hir::Node::Block(hir::Block { expr: Some(&ref p), .. })
| hir::Node::Expr(&ref p), | hir::Node::Expr(&ref p),
) = self.tcx.hir().find(parent_id) ) = self.tcx.opt_hir_node(parent_id)
else { else {
break; break;
}; };
@ -570,7 +570,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let mut direct = false; let mut direct = false;
loop { loop {
// Climb the HIR tree to find the (desugared) `loop` this `break` corresponds to. // Climb the HIR tree to find the (desugared) `loop` this `break` corresponds to.
let parent = match self.tcx.hir().find(parent_id) { let parent = match self.tcx.opt_hir_node(parent_id) {
Some(hir::Node::Expr(&ref parent)) => { Some(hir::Node::Expr(&ref parent)) => {
parent_id = self.tcx.hir().parent_id(parent.hir_id); parent_id = self.tcx.hir().parent_id(parent.hir_id);
parent parent
@ -672,7 +672,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
error: Option<TypeError<'tcx>>, error: Option<TypeError<'tcx>>,
) { ) {
let parent = self.tcx.hir().parent_id(expr.hir_id); let parent = self.tcx.hir().parent_id(expr.hir_id);
match (self.tcx.hir().find(parent), error) { match (self.tcx.opt_hir_node(parent), error) {
(Some(hir::Node::Local(hir::Local { ty: Some(ty), init: Some(init), .. })), _) (Some(hir::Node::Local(hir::Local { ty: Some(ty), init: Some(init), .. })), _)
if init.hir_id == expr.hir_id => if init.hir_id == expr.hir_id =>
{ {
@ -717,7 +717,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
None, None,
hir::Path { res: hir::def::Res::Local(hir_id), .. }, hir::Path { res: hir::def::Res::Local(hir_id), .. },
)) => { )) => {
if let Some(hir::Node::Pat(pat)) = self.tcx.hir().find(*hir_id) { if let Some(hir::Node::Pat(pat)) = self.tcx.opt_hir_node(*hir_id) {
primary_span = pat.span; primary_span = pat.span;
secondary_span = pat.span; secondary_span = pat.span;
match self.tcx.hir().find_parent(pat.hir_id) { match self.tcx.hir().find_parent(pat.hir_id) {
@ -790,7 +790,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
return; return;
}; };
let Some(hir::Node::Expr(hir::Expr { kind: hir::ExprKind::Assign(lhs, rhs, _), .. })) = let Some(hir::Node::Expr(hir::Expr { kind: hir::ExprKind::Assign(lhs, rhs, _), .. })) =
self.tcx.hir().find(parent) self.tcx.opt_hir_node(parent)
else { else {
return; return;
}; };
@ -1014,8 +1014,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
hir::Path { res: hir::def::Res::Local(bind_hir_id), .. }, hir::Path { res: hir::def::Res::Local(bind_hir_id), .. },
)) = expr.kind )) = expr.kind
{ {
let bind = self.tcx.hir().find(*bind_hir_id); let bind = self.tcx.opt_hir_node(*bind_hir_id);
let parent = self.tcx.hir().find(self.tcx.hir().parent_id(*bind_hir_id)); let parent = self.tcx.opt_hir_node(self.tcx.hir().parent_id(*bind_hir_id));
if let Some(hir::Node::Pat(hir::Pat { if let Some(hir::Node::Pat(hir::Pat {
kind: hir::PatKind::Binding(_, _hir_id, _, _), kind: hir::PatKind::Binding(_, _hir_id, _, _),
.. ..

View File

@ -883,7 +883,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
kind: hir::ImplItemKind::Fn(..), kind: hir::ImplItemKind::Fn(..),
span: encl_fn_span, span: encl_fn_span,
.. ..
})) = self.tcx.hir().find_by_def_id(encl_item_id.def_id) })) = self.tcx.opt_hir_node_by_def_id(encl_item_id.def_id)
{ {
// We are inside a function body, so reporting "return statement // We are inside a function body, so reporting "return statement
// outside of function body" needs an explanation. // outside of function body" needs an explanation.
@ -997,7 +997,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
then: impl FnOnce(&hir::Expr<'_>), then: impl FnOnce(&hir::Expr<'_>),
) { ) {
let mut parent = self.tcx.hir().parent_id(original_expr_id); let mut parent = self.tcx.hir().parent_id(original_expr_id);
while let Some(node) = self.tcx.hir().find(parent) { while let Some(node) = self.tcx.opt_hir_node(parent) {
match node { match node {
hir::Node::Expr(hir::Expr { hir::Node::Expr(hir::Expr {
kind: kind:

View File

@ -994,7 +994,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// Get enclosing Fn, if it is a function or a trait method, unless there's a `loop` or // Get enclosing Fn, if it is a function or a trait method, unless there's a `loop` or
// `while` before reaching it, as block tail returns are not available in them. // `while` before reaching it, as block tail returns are not available in them.
self.tcx.hir().get_return_block(blk_id).and_then(|blk_id| { self.tcx.hir().get_return_block(blk_id).and_then(|blk_id| {
let parent = self.tcx.hir().get(blk_id); let parent = self.tcx.hir_node(blk_id);
self.get_node_fn_decl(parent) self.get_node_fn_decl(parent)
.map(|(fn_id, fn_decl, _, is_main)| (fn_id, fn_decl, is_main)) .map(|(fn_id, fn_decl, _, is_main)| (fn_id, fn_decl, is_main))
}) })

View File

@ -94,7 +94,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
let hir = self.tcx.hir(); let hir = self.tcx.hir();
let (expr, qpath) = match hir.get(hir_id) { let (expr, qpath) = match self.tcx.hir_node(hir_id) {
hir::Node::Expr(expr) => { hir::Node::Expr(expr) => {
if self.closure_span_overlaps_error(error, expr.span) { if self.closure_span_overlaps_error(error, expr.span) {
return false; return false;
@ -454,7 +454,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
.find_ancestor_in_same_ctxt(error.obligation.cause.span) .find_ancestor_in_same_ctxt(error.obligation.cause.span)
.unwrap_or(arg.span); .unwrap_or(arg.span);
if let hir::Node::Expr(arg_expr) = self.tcx.hir().get(arg.hir_id) { if let hir::Node::Expr(arg_expr) = self.tcx.hir_node(arg.hir_id) {
// This is more specific than pointing at the entire argument. // This is more specific than pointing at the entire argument.
self.blame_specific_expr_if_possible(error, arg_expr) self.blame_specific_expr_if_possible(error, arg_expr)
} }

View File

@ -1734,7 +1734,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
fn parent_item_span(&self, id: hir::HirId) -> Option<Span> { fn parent_item_span(&self, id: hir::HirId) -> Option<Span> {
let node = self.tcx.hir().get_by_def_id(self.tcx.hir().get_parent_item(id).def_id); let node = self.tcx.hir_node_by_def_id(self.tcx.hir().get_parent_item(id).def_id);
match node { match node {
Node::Item(&hir::Item { kind: hir::ItemKind::Fn(_, _, body_id), .. }) Node::Item(&hir::Item { kind: hir::ItemKind::Fn(_, _, body_id), .. })
| Node::ImplItem(&hir::ImplItem { kind: hir::ImplItemKind::Fn(_, body_id), .. }) => { | Node::ImplItem(&hir::ImplItem { kind: hir::ImplItemKind::Fn(_, body_id), .. }) => {
@ -1750,7 +1750,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
/// Given a function block's `HirId`, returns its `FnDecl` if it exists, or `None` otherwise. /// Given a function block's `HirId`, returns its `FnDecl` if it exists, or `None` otherwise.
fn get_parent_fn_decl(&self, blk_id: hir::HirId) -> Option<(&'tcx hir::FnDecl<'tcx>, Ident)> { fn get_parent_fn_decl(&self, blk_id: hir::HirId) -> Option<(&'tcx hir::FnDecl<'tcx>, Ident)> {
let parent = self.tcx.hir().get_by_def_id(self.tcx.hir().get_parent_item(blk_id).def_id); let parent = self.tcx.hir_node_by_def_id(self.tcx.hir().get_parent_item(blk_id).def_id);
self.get_node_fn_decl(parent).map(|(_, fn_decl, ident, _)| (fn_decl, ident)) self.get_node_fn_decl(parent).map(|(_, fn_decl, ident, _)| (fn_decl, ident))
} }
@ -2084,7 +2084,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let node = self let node = self
.tcx .tcx
.opt_local_def_id_to_hir_id(self.tcx.hir().get_parent_item(call_expr.hir_id)) .opt_local_def_id_to_hir_id(self.tcx.hir().get_parent_item(call_expr.hir_id))
.and_then(|hir_id| self.tcx.hir().find(hir_id)); .and_then(|hir_id| self.tcx.opt_hir_node(hir_id));
match node { match node {
Some(hir::Node::Item(item)) => call_finder.visit_item(item), Some(hir::Node::Item(item)) => call_finder.visit_item(item),
Some(hir::Node::TraitItem(item)) => call_finder.visit_trait_item(item), Some(hir::Node::TraitItem(item)) => call_finder.visit_trait_item(item),

View File

@ -677,7 +677,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// can suggest Box::pin. // can suggest Box::pin.
let parent = self.tcx.hir().parent_id(expr.hir_id); let parent = self.tcx.hir().parent_id(expr.hir_id);
let Some(Node::Expr(Expr { kind: ExprKind::Call(fn_name, _), .. })) = let Some(Node::Expr(Expr { kind: ExprKind::Call(fn_name, _), .. })) =
self.tcx.hir().find(parent) self.tcx.opt_hir_node(parent)
else { else {
return false; return false;
}; };
@ -824,7 +824,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
if let hir::TyKind::OpaqueDef(item_id, ..) = hir_ty.kind if let hir::TyKind::OpaqueDef(item_id, ..) = hir_ty.kind
&& let hir::Node::Item(hir::Item { && let hir::Node::Item(hir::Item {
kind: hir::ItemKind::OpaqueTy(op_ty), .. kind: hir::ItemKind::OpaqueTy(op_ty), ..
}) = self.tcx.hir().get(item_id.hir_id()) }) = self.tcx.hir_node(item_id.hir_id())
&& let [ && let [
hir::GenericBound::LangItemTrait(hir::LangItem::Future, _, _, generic_args), hir::GenericBound::LangItemTrait(hir::LangItem::Future, _, _, generic_args),
] = op_ty.bounds ] = op_ty.bounds
@ -902,7 +902,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let ty::Param(expected_ty_as_param) = expected.kind() else { return }; let ty::Param(expected_ty_as_param) = expected.kind() else { return };
let fn_node = self.tcx.hir().find(fn_id); let fn_node = self.tcx.opt_hir_node(fn_id);
let Some(hir::Node::Item(hir::Item { let Some(hir::Node::Item(hir::Item {
kind: kind:
@ -1047,7 +1047,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}; };
let ty = self.normalize(expr.span, ty); let ty = self.normalize(expr.span, ty);
if self.can_coerce(found, ty) { if self.can_coerce(found, ty) {
if let Some(node) = self.tcx.hir().find(fn_id) if let Some(node) = self.tcx.opt_hir_node(fn_id)
&& let Some(owner_node) = node.as_owner() && let Some(owner_node) = node.as_owner()
&& let Some(span) = expr.span.find_ancestor_inside(owner_node.span()) && let Some(span) = expr.span.find_ancestor_inside(owner_node.span())
{ {
@ -1545,12 +1545,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
fn is_loop(&self, id: hir::HirId) -> bool { fn is_loop(&self, id: hir::HirId) -> bool {
let node = self.tcx.hir().get(id); let node = self.tcx.hir_node(id);
matches!(node, Node::Expr(Expr { kind: ExprKind::Loop(..), .. })) matches!(node, Node::Expr(Expr { kind: ExprKind::Loop(..), .. }))
} }
fn is_local_statement(&self, id: hir::HirId) -> bool { fn is_local_statement(&self, id: hir::HirId) -> bool {
let node = self.tcx.hir().get(id); let node = self.tcx.hir_node(id);
matches!(node, Node::Stmt(Stmt { kind: StmtKind::Local(..), .. })) matches!(node, Node::Stmt(Stmt { kind: StmtKind::Local(..), .. }))
} }
@ -1677,11 +1677,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
None, None,
hir::Path { segments: [_], res: crate::Res::Local(binding), .. }, hir::Path { segments: [_], res: crate::Res::Local(binding), .. },
)) => { )) => {
let Some(hir::Node::Pat(hir::Pat { hir_id, .. })) = self.tcx.hir().find(*binding) let Some(hir::Node::Pat(hir::Pat { hir_id, .. })) = self.tcx.opt_hir_node(*binding)
else { else {
return expr; return expr;
}; };
let Some(parent) = self.tcx.hir().find(self.tcx.hir().parent_id(*hir_id)) else { let Some(parent) = self.tcx.opt_hir_node(self.tcx.hir().parent_id(*hir_id)) else {
return expr; return expr;
}; };
@ -1697,7 +1697,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
.. ..
}) => { }) => {
let Some(hir::Node::Local(hir::Local { init: Some(init), .. })) = let Some(hir::Node::Local(hir::Local { init: Some(init), .. })) =
self.tcx.hir().find(self.tcx.hir().parent_id(*pat_hir_id)) self.tcx.opt_hir_node(self.tcx.hir().parent_id(*pat_hir_id))
else { else {
return expr; return expr;
}; };
@ -1730,8 +1730,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
&& let hir::Path { segments: [_], res: crate::Res::Local(binding), .. } = && let hir::Path { segments: [_], res: crate::Res::Local(binding), .. } =
call_expr_path call_expr_path
&& let Some(hir::Node::Pat(hir::Pat { hir_id, .. })) = && let Some(hir::Node::Pat(hir::Pat { hir_id, .. })) =
self.tcx.hir().find(*binding) self.tcx.opt_hir_node(*binding)
&& let Some(closure) = self.tcx.hir().find(self.tcx.hir().parent_id(*hir_id)) && let Some(closure) = self.tcx.opt_hir_node(self.tcx.hir().parent_id(*hir_id))
&& let hir::Node::Local(hir::Local { init: Some(init), .. }) = closure && let hir::Node::Local(hir::Local { init: Some(init), .. }) = closure
&& let Expr { && let Expr {
kind: hir::ExprKind::Closure(hir::Closure { body: body_id, .. }), kind: hir::ExprKind::Closure(hir::Closure { body: body_id, .. }),
@ -1985,7 +1985,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
if let Some(hir::Node::Block(&hir::Block { if let Some(hir::Node::Block(&hir::Block {
span: block_span, expr: Some(e), .. span: block_span, expr: Some(e), ..
})) = self.tcx.hir().find(parent) })) = self.tcx.opt_hir_node(parent)
{ {
if e.hir_id == id { if e.hir_id == id {
if let Some(span) = expr.span.find_ancestor_inside(block_span) { if let Some(span) = expr.span.find_ancestor_inside(block_span) {
@ -2211,7 +2211,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let local_parent = self.tcx.hir().parent_id(local_id); let local_parent = self.tcx.hir().parent_id(local_id);
let Some(Node::Param(hir::Param { hir_id: param_hir_id, .. })) = let Some(Node::Param(hir::Param { hir_id: param_hir_id, .. })) =
self.tcx.hir().find(local_parent) self.tcx.opt_hir_node(local_parent)
else { else {
return None; return None;
}; };
@ -2221,13 +2221,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
hir_id: expr_hir_id, hir_id: expr_hir_id,
kind: hir::ExprKind::Closure(hir::Closure { fn_decl: closure_fn_decl, .. }), kind: hir::ExprKind::Closure(hir::Closure { fn_decl: closure_fn_decl, .. }),
.. ..
})) = self.tcx.hir().find(param_parent) })) = self.tcx.opt_hir_node(param_parent)
else { else {
return None; return None;
}; };
let expr_parent = self.tcx.hir().parent_id(*expr_hir_id); let expr_parent = self.tcx.hir().parent_id(*expr_hir_id);
let hir = self.tcx.hir().find(expr_parent); let hir = self.tcx.opt_hir_node(expr_parent);
let closure_params_len = closure_fn_decl.inputs.len(); let closure_params_len = closure_fn_decl.inputs.len();
let ( let (
Some(Node::Expr(hir::Expr { Some(Node::Expr(hir::Expr {
@ -2667,7 +2667,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
if let Some(Node::Expr(hir::Expr { if let Some(Node::Expr(hir::Expr {
kind: hir::ExprKind::If(_, _, Some(else_expr)), kind: hir::ExprKind::If(_, _, Some(else_expr)),
.. ..
})) = self.tcx.hir().find(parent_id) })) = self.tcx.opt_hir_node(parent_id)
{ {
return else_expr.hir_id == expr.hir_id; return else_expr.hir_id == expr.hir_id;
} }
@ -3057,7 +3057,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
return; return;
}; };
let parent = self.tcx.hir().parent_id(expr.hir_id); let parent = self.tcx.hir().parent_id(expr.hir_id);
if let Some(hir::Node::ExprField(_)) = self.tcx.hir().find(parent) { if let Some(hir::Node::ExprField(_)) = self.tcx.opt_hir_node(parent) {
// Ignore `Foo { field: a..Default::default() }` // Ignore `Foo { field: a..Default::default() }`
return; return;
} }
@ -3136,7 +3136,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let hir::def::Res::Local(hir_id) = path.res else { let hir::def::Res::Local(hir_id) = path.res else {
return; return;
}; };
let Some(hir::Node::Pat(pat)) = self.tcx.hir().find(hir_id) else { let Some(hir::Node::Pat(pat)) = self.tcx.opt_hir_node(hir_id) else {
return; return;
}; };
let Some(hir::Node::Local(hir::Local { ty: None, init: Some(init), .. })) = let Some(hir::Node::Local(hir::Local { ty: None, init: Some(init), .. })) =

View File

@ -127,7 +127,7 @@ fn has_typeck_results(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
} }
if let Some(def_id) = def_id.as_local() { if let Some(def_id) = def_id.as_local() {
primary_body_of(tcx.hir().get_by_def_id(def_id)).is_some() primary_body_of(tcx.hir_node_by_def_id(def_id)).is_some()
} else { } else {
false false
} }
@ -166,7 +166,7 @@ fn typeck_with_fallback<'tcx>(
} }
let id = tcx.local_def_id_to_hir_id(def_id); let id = tcx.local_def_id_to_hir_id(def_id);
let node = tcx.hir().get(id); let node = tcx.hir_node(id);
let span = tcx.hir().span(id); let span = tcx.hir().span(id);
// Figure out what primary body this item has. // Figure out what primary body this item has.
@ -201,7 +201,7 @@ fn typeck_with_fallback<'tcx>(
span, span,
})) }))
} else if let Node::AnonConst(_) = node { } else if let Node::AnonConst(_) = node {
match tcx.hir().get(tcx.hir().parent_id(id)) { match tcx.hir_node(tcx.hir().parent_id(id)) {
Node::Ty(&hir::Ty { kind: hir::TyKind::Typeof(ref anon_const), .. }) Node::Ty(&hir::Ty { kind: hir::TyKind::Typeof(ref anon_const), .. })
if anon_const.hir_id == id => if anon_const.hir_id == id =>
{ {

View File

@ -230,7 +230,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = kind if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = kind
&& let hir::def::Res::Local(hir_id) = path.res && let hir::def::Res::Local(hir_id) = path.res
&& let Some(hir::Node::Pat(b)) = self.tcx.hir().find(hir_id) && let Some(hir::Node::Pat(b)) = self.tcx.opt_hir_node(hir_id)
&& let Some(hir::Node::Param(p)) = self.tcx.hir().find_parent(b.hir_id) && let Some(hir::Node::Param(p)) = self.tcx.hir().find_parent(b.hir_id)
&& let Some(node) = self.tcx.hir().find_parent(p.hir_id) && let Some(node) = self.tcx.hir().find_parent(p.hir_id)
&& let Some(decl) = node.fn_decl() && let Some(decl) = node.fn_decl()
@ -605,16 +605,16 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
if let (ty::Param(_), ty::PredicateKind::Clause(ty::ClauseKind::Trait(p))) = if let (ty::Param(_), ty::PredicateKind::Clause(ty::ClauseKind::Trait(p))) =
(self_ty.kind(), parent_pred.kind().skip_binder()) (self_ty.kind(), parent_pred.kind().skip_binder())
{ {
let hir = self.tcx.hir();
let node = match p.trait_ref.self_ty().kind() { let node = match p.trait_ref.self_ty().kind() {
ty::Param(_) => { ty::Param(_) => {
// Account for `fn` items like in `issue-35677.rs` to // Account for `fn` items like in `issue-35677.rs` to
// suggest restricting its type params. // suggest restricting its type params.
Some(hir.get_by_def_id(self.body_id)) Some(self.tcx.hir_node_by_def_id(self.body_id))
}
ty::Adt(def, _) => {
def.did().as_local().map(|def_id| hir.get_by_def_id(def_id))
} }
ty::Adt(def, _) => def
.did()
.as_local()
.map(|def_id| self.tcx.hir_node_by_def_id(def_id)),
_ => None, _ => None,
}; };
if let Some(hir::Node::Item(hir::Item { kind, .. })) = node if let Some(hir::Node::Item(hir::Item { kind, .. })) = node
@ -1952,7 +1952,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
visitor.visit_body(body); visitor.visit_body(body);
let parent = self.tcx.hir().parent_id(seg1.hir_id); let parent = self.tcx.hir().parent_id(seg1.hir_id);
if let Some(Node::Expr(call_expr)) = self.tcx.hir().find(parent) if let Some(Node::Expr(call_expr)) = self.tcx.opt_hir_node(parent)
&& let Some(expr) = visitor.result && let Some(expr) = visitor.result
&& let Some(self_ty) = self.node_ty_opt(expr.hir_id) && let Some(self_ty) = self.node_ty_opt(expr.hir_id)
{ {
@ -2869,11 +2869,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let id = item let id = item
.def_id .def_id
.as_local() .as_local()
.map(|def_id| self.tcx.local_def_id_to_hir_id(def_id)); .map(|def_id| self.tcx.hir_node_by_def_id(def_id));
if let Some(hir::Node::TraitItem(hir::TraitItem { if let Some(hir::Node::TraitItem(hir::TraitItem {
kind: hir::TraitItemKind::Fn(fn_sig, method), kind: hir::TraitItemKind::Fn(fn_sig, method),
.. ..
})) = id.map(|id| self.tcx.hir().get(id)) })) = id
{ {
let self_first_arg = match method { let self_first_arg = match method {
hir::TraitFn::Required([ident, ..]) => { hir::TraitFn::Required([ident, ..]) => {
@ -2963,7 +2963,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// Get the `hir::Param` to verify whether it already has any bounds. // Get the `hir::Param` to verify whether it already has any bounds.
// We do this to avoid suggesting code that ends up as `T: FooBar`, // We do this to avoid suggesting code that ends up as `T: FooBar`,
// instead we suggest `T: Foo + Bar` in that case. // instead we suggest `T: Foo + Bar` in that case.
match hir.get(id) { match self.tcx.hir_node(id) {
Node::GenericParam(param) => { Node::GenericParam(param) => {
enum Introducer { enum Introducer {
Plus, Plus,
@ -3183,7 +3183,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
let parent = self.tcx.hir().parent_id(expr.hir_id); let parent = self.tcx.hir().parent_id(expr.hir_id);
if let Some(Node::Expr(call_expr)) = self.tcx.hir().find(parent) if let Some(Node::Expr(call_expr)) = self.tcx.opt_hir_node(parent)
&& let hir::ExprKind::MethodCall( && let hir::ExprKind::MethodCall(
hir::PathSegment { ident: method_name, .. }, hir::PathSegment { ident: method_name, .. },
self_expr, self_expr,

View File

@ -720,7 +720,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
&& let PatKind::Binding(_, _, binding, ..) = inner.kind && let PatKind::Binding(_, _, binding, ..) = inner.kind
{ {
let binding_parent_id = tcx.hir().parent_id(pat.hir_id); let binding_parent_id = tcx.hir().parent_id(pat.hir_id);
let binding_parent = tcx.hir().get(binding_parent_id); let binding_parent = tcx.hir_node(binding_parent_id);
debug!(?inner, ?pat, ?binding_parent); debug!(?inner, ?pat, ?binding_parent);
let mutability = match mutbl { let mutability = match mutbl {
@ -941,7 +941,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
Some(hir::Node::Item(hir::Item { Some(hir::Node::Item(hir::Item {
kind: hir::ItemKind::Const(_, _, body_id), kind: hir::ItemKind::Const(_, _, body_id),
.. ..
})) => match self.tcx.hir().get(body_id.hir_id) { })) => match self.tcx.hir_node(body_id.hir_id) {
hir::Node::Expr(expr) => { hir::Node::Expr(expr) => {
if hir::is_range_literal(expr) { if hir::is_range_literal(expr) {
let span = self.tcx.hir().span(body_id.hir_id); let span = self.tcx.hir().span(body_id.hir_id);

View File

@ -69,12 +69,13 @@ pub fn resolve_rvalue_scopes<'a, 'tcx>(
def_id: DefId, def_id: DefId,
) -> RvalueScopes { ) -> RvalueScopes {
let tcx = &fcx.tcx; let tcx = &fcx.tcx;
let hir_map = tcx.hir();
let mut rvalue_scopes = RvalueScopes::new(); let mut rvalue_scopes = RvalueScopes::new();
debug!("start resolving rvalue scopes, def_id={def_id:?}"); debug!("start resolving rvalue scopes, def_id={def_id:?}");
debug!("rvalue_scope: rvalue_candidates={:?}", scope_tree.rvalue_candidates); debug!("rvalue_scope: rvalue_candidates={:?}", scope_tree.rvalue_candidates);
for (&hir_id, candidate) in &scope_tree.rvalue_candidates { for (&hir_id, candidate) in &scope_tree.rvalue_candidates {
let Some(Node::Expr(expr)) = hir_map.find(hir_id) else { bug!("hir node does not exist") }; let Some(Node::Expr(expr)) = tcx.opt_hir_node(hir_id) else {
bug!("hir node does not exist")
};
record_rvalue_scope(&mut rvalue_scopes, expr, candidate); record_rvalue_scope(&mut rvalue_scopes, expr, candidate);
} }
rvalue_scopes rvalue_scopes

View File

@ -853,7 +853,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// Looks like a macro fragment. Try to find the real block. // Looks like a macro fragment. Try to find the real block.
if let Some(hir::Node::Expr(&hir::Expr { if let Some(hir::Node::Expr(&hir::Expr {
kind: hir::ExprKind::Block(block, ..), .. kind: hir::ExprKind::Block(block, ..), ..
})) = self.tcx.hir().find(body_id.hir_id) { })) = self.tcx.opt_hir_node(body_id.hir_id) {
// If the body is a block (with `{..}`), we use the span of that block. // If the body is a block (with `{..}`), we use the span of that block.
// E.g. with a `|| $body` expanded from a `m!({ .. })`, we use `{ .. }`, and not `$body`. // E.g. with a `|| $body` expanded from a `m!({ .. })`, we use `{ .. }`, and not `$body`.
// Since we know it's a block, we know we can insert the `let _ = ..` without // Since we know it's a block, we know we can insert the `let _ = ..` without
@ -1673,7 +1673,7 @@ fn apply_capture_kind_on_capture_ty<'tcx>(
fn drop_location_span(tcx: TyCtxt<'_>, hir_id: hir::HirId) -> Span { fn drop_location_span(tcx: TyCtxt<'_>, hir_id: hir::HirId) -> Span {
let owner_id = tcx.hir().get_enclosing_scope(hir_id).unwrap(); let owner_id = tcx.hir().get_enclosing_scope(hir_id).unwrap();
let owner_node = tcx.hir().get(owner_id); let owner_node = tcx.hir_node(owner_id);
let owner_span = match owner_node { let owner_span = match owner_node {
hir::Node::Item(item) => match item.kind { hir::Node::Item(item) => match item.kind {
hir::ItemKind::Fn(_, _, owner_id) => tcx.hir().span(owner_id.hir_id), hir::ItemKind::Fn(_, _, owner_id) => tcx.hir().span(owner_id.hir_id),

View File

@ -232,7 +232,7 @@ impl<'tcx> DirtyCleanVisitor<'tcx> {
/// Return all DepNode labels that should be asserted for this item. /// Return all DepNode labels that should be asserted for this item.
/// index=0 is the "name" used for error messages /// index=0 is the "name" used for error messages
fn auto_labels(&mut self, item_id: LocalDefId, attr: &Attribute) -> (&'static str, Labels) { fn auto_labels(&mut self, item_id: LocalDefId, attr: &Attribute) -> (&'static str, Labels) {
let node = self.tcx.hir().get_by_def_id(item_id); let node = self.tcx.hir_node_by_def_id(item_id);
let (name, labels) = match node { let (name, labels) = match node {
HirNode::Item(item) => { HirNode::Item(item) => {
match item.kind { match item.kind {

View File

@ -363,9 +363,7 @@ impl AddToDiagnostic for AddLifetimeParamsSuggestion<'_> {
return false; return false;
}; };
let hir_id = self.tcx.local_def_id_to_hir_id(anon_reg.def_id); let node = self.tcx.hir_node_by_def_id(anon_reg.def_id);
let node = self.tcx.hir().get(hir_id);
let is_impl = matches!(&node, hir::Node::ImplItem(_)); let is_impl = matches!(&node, hir::Node::ImplItem(_));
let generics = match node { let generics = match node {
hir::Node::Item(&hir::Item { hir::Node::Item(&hir::Item {

View File

@ -891,7 +891,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
} }
// don't suggest wrapping either blocks in `if .. {} else {}` // don't suggest wrapping either blocks in `if .. {} else {}`
let is_empty_arm = |id| { let is_empty_arm = |id| {
let hir::Node::Block(blk) = self.tcx.hir().get(id) else { let hir::Node::Block(blk) = self.tcx.hir_node(id) else {
return false; return false;
}; };
if blk.expr.is_some() || !blk.stmts.is_empty() { if blk.expr.is_some() || !blk.stmts.is_empty() {
@ -2007,7 +2007,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
diag.span_note(span, "this closure does not fulfill the lifetime requirements"); diag.span_note(span, "this closure does not fulfill the lifetime requirements");
self.suggest_for_all_lifetime_closure( self.suggest_for_all_lifetime_closure(
span, span,
self.tcx.hir().get_by_def_id(def_id), self.tcx.hir_node_by_def_id(def_id),
&exp_found, &exp_found,
diag, diag,
); );
@ -2121,7 +2121,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
let TypeError::FixedArraySize(sz) = terr else { let TypeError::FixedArraySize(sz) = terr else {
return None; return None;
}; };
let tykind = match hir.find_by_def_id(trace.cause.body_id) { let tykind = match self.tcx.opt_hir_node_by_def_id(trace.cause.body_id) {
Some(hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, _, body_id), .. })) => { Some(hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, _, body_id), .. })) => {
let body = hir.body(*body_id); let body = hir.body(*body_id);
struct LetVisitor<'v> { struct LetVisitor<'v> {
@ -2997,7 +2997,7 @@ impl<'tcx> InferCtxt<'tcx> {
/// Given a [`hir::HirId`] for a block, get the span of its last expression /// Given a [`hir::HirId`] for a block, get the span of its last expression
/// or statement, peeling off any inner blocks. /// or statement, peeling off any inner blocks.
pub fn find_block_span_from_hir_id(&self, hir_id: hir::HirId) -> Span { pub fn find_block_span_from_hir_id(&self, hir_id: hir::HirId) -> Span {
match self.tcx.hir().get(hir_id) { match self.tcx.hir_node(hir_id) {
hir::Node::Block(blk) => self.find_block_span(blk), hir::Node::Block(blk) => self.find_block_span(blk),
// The parser was in a weird state if either of these happen, but // The parser was in a weird state if either of these happen, but
// it's better not to panic. // it's better not to panic.

View File

@ -26,8 +26,7 @@ pub fn find_anon_type<'tcx>(
br: &ty::BoundRegionKind, br: &ty::BoundRegionKind,
) -> Option<(&'tcx hir::Ty<'tcx>, &'tcx hir::FnSig<'tcx>)> { ) -> Option<(&'tcx hir::Ty<'tcx>, &'tcx hir::FnSig<'tcx>)> {
let anon_reg = tcx.is_suitable_region(region)?; let anon_reg = tcx.is_suitable_region(region)?;
let hir_id = tcx.local_def_id_to_hir_id(anon_reg.def_id); let fn_sig = tcx.hir_node_by_def_id(anon_reg.def_id).fn_sig()?;
let fn_sig = tcx.hir().get(hir_id).fn_sig()?;
fn_sig fn_sig
.decl .decl

View File

@ -460,7 +460,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
tcx.hir().trait_impls(trait_did).iter().find_map(|&impl_did| { tcx.hir().trait_impls(trait_did).iter().find_map(|&impl_did| {
if let Node::Item(Item { if let Node::Item(Item {
kind: ItemKind::Impl(hir::Impl { self_ty, .. }), .. kind: ItemKind::Impl(hir::Impl { self_ty, .. }), ..
}) = tcx.hir().find_by_def_id(impl_did)? }) = tcx.opt_hir_node_by_def_id(impl_did)?
&& trait_objects.iter().all(|did| { && trait_objects.iter().all(|did| {
// FIXME: we should check `self_ty` against the receiver // FIXME: we should check `self_ty` against the receiver
// type in the `UnifyReceiver` context, but for now, use // type in the `UnifyReceiver` context, but for now, use

View File

@ -50,11 +50,10 @@ pub fn find_param_with_region<'tcx>(
let hir = &tcx.hir(); let hir = &tcx.hir();
let def_id = id.as_local()?; let def_id = id.as_local()?;
let hir_id = tcx.local_def_id_to_hir_id(def_id);
// FIXME: use def_kind // FIXME: use def_kind
// Don't perform this on closures // Don't perform this on closures
match hir.get(hir_id) { match tcx.hir_node_by_def_id(def_id) {
hir::Node::Expr(&hir::Expr { kind: hir::ExprKind::Closure { .. }, .. }) => { hir::Node::Expr(&hir::Expr { kind: hir::ExprKind::Closure { .. }, .. }) => {
return None; return None;
} }

View File

@ -655,7 +655,7 @@ fn foo(&self) -> Self::T { String::new() }
// When `body_owner` is an `impl` or `trait` item, look in its associated types for // When `body_owner` is an `impl` or `trait` item, look in its associated types for
// `expected` and point at it. // `expected` and point at it.
let parent_id = tcx.hir().get_parent_item(hir_id); let parent_id = tcx.hir().get_parent_item(hir_id);
let item = tcx.hir().find_by_def_id(parent_id.def_id); let item = tcx.opt_hir_node_by_def_id(parent_id.def_id);
debug!("expected_projection parent item {:?}", item); debug!("expected_projection parent item {:?}", item);

View File

@ -42,7 +42,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
] ]
.into_iter() .into_iter()
.find_map(|(id, ty)| { .find_map(|(id, ty)| {
let hir::Node::Block(blk) = self.tcx.hir().get(id?) else { return None }; let hir::Node::Block(blk) = self.tcx.hir_node(id?) else { return None };
self.could_remove_semicolon(blk, ty) self.could_remove_semicolon(blk, ty)
}); });
match remove_semicolon { match remove_semicolon {
@ -62,7 +62,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
let mut ret = None; let mut ret = None;
for (id, ty) in [(first_id, second_ty), (second_id, first_ty)] { for (id, ty) in [(first_id, second_ty), (second_id, first_ty)] {
if let Some(id) = id if let Some(id) = id
&& let hir::Node::Block(blk) = self.tcx.hir().get(id) && let hir::Node::Block(blk) = self.tcx.hir_node(id)
&& let Some(diag) = self.consider_returning_binding_diag(blk, ty) && let Some(diag) = self.consider_returning_binding_diag(blk, ty)
{ {
ret = Some(diag); ret = Some(diag);

View File

@ -683,8 +683,8 @@ fn may_define_opaque_type(tcx: TyCtxt<'_>, def_id: LocalDefId, opaque_hir_id: hi
let res = hir_id == scope; let res = hir_id == scope;
trace!( trace!(
"may_define_opaque_type(def={:?}, opaque_node={:?}) = {}", "may_define_opaque_type(def={:?}, opaque_node={:?}) = {}",
tcx.hir().find(hir_id), tcx.opt_hir_node(hir_id),
tcx.hir().get(opaque_hir_id), tcx.hir_node(opaque_hir_id),
res res
); );
res res

View File

@ -34,7 +34,7 @@ declare_lint_pass!(DefaultHashTypes => [DEFAULT_HASH_TYPES]);
impl LateLintPass<'_> for DefaultHashTypes { impl LateLintPass<'_> for DefaultHashTypes {
fn check_path(&mut self, cx: &LateContext<'_>, path: &Path<'_>, hir_id: HirId) { fn check_path(&mut self, cx: &LateContext<'_>, path: &Path<'_>, hir_id: HirId) {
let Res::Def(rustc_hir::def::DefKind::Struct, def_id) = path.res else { return }; let Res::Def(rustc_hir::def::DefKind::Struct, def_id) = path.res else { return };
if matches!(cx.tcx.hir().get(hir_id), Node::Item(Item { kind: ItemKind::Use(..), .. })) { if matches!(cx.tcx.hir_node(hir_id), Node::Item(Item { kind: ItemKind::Use(..), .. })) {
// don't lint imports, only actual usages // don't lint imports, only actual usages
return; return;
} }

View File

@ -202,7 +202,7 @@ fn lint_overflowing_range_endpoint<'tcx>(
) -> bool { ) -> bool {
// Look past casts to support cases like `0..256 as u8` // Look past casts to support cases like `0..256 as u8`
let (expr, lit_span) = if let Node::Expr(par_expr) = let (expr, lit_span) = if let Node::Expr(par_expr) =
cx.tcx.hir().get(cx.tcx.hir().parent_id(expr.hir_id)) cx.tcx.hir_node(cx.tcx.hir().parent_id(expr.hir_id))
&& let ExprKind::Cast(_, _) = par_expr.kind && let ExprKind::Cast(_, _) = par_expr.kind
{ {
(par_expr, expr.span) (par_expr, expr.span)
@ -213,7 +213,7 @@ fn lint_overflowing_range_endpoint<'tcx>(
// We only want to handle exclusive (`..`) ranges, // We only want to handle exclusive (`..`) ranges,
// which are represented as `ExprKind::Struct`. // which are represented as `ExprKind::Struct`.
let par_id = cx.tcx.hir().parent_id(expr.hir_id); let par_id = cx.tcx.hir().parent_id(expr.hir_id);
let Node::ExprField(field) = cx.tcx.hir().get(par_id) else { return false }; let Node::ExprField(field) = cx.tcx.hir_node(par_id) else { return false };
let Node::Expr(struct_expr) = cx.tcx.hir().get_parent(field.hir_id) else { return false }; let Node::Expr(struct_expr) = cx.tcx.hir().get_parent(field.hir_id) else { return false };
if !is_range_literal(struct_expr) { if !is_range_literal(struct_expr) {
return false; return false;
@ -498,7 +498,7 @@ fn lint_uint_literal<'tcx>(
}; };
if lit_val < min || lit_val > max { if lit_val < min || lit_val > max {
let parent_id = cx.tcx.hir().parent_id(e.hir_id); let parent_id = cx.tcx.hir().parent_id(e.hir_id);
if let Node::Expr(par_e) = cx.tcx.hir().get(parent_id) { if let Node::Expr(par_e) = cx.tcx.hir_node(parent_id) {
match par_e.kind { match par_e.kind {
hir::ExprKind::Cast(..) => { hir::ExprKind::Cast(..) => {
if let ty::Char = cx.typeck_results().expr_ty(par_e).kind() { if let ty::Char = cx.typeck_results().expr_ty(par_e).kind() {

View File

@ -1144,7 +1144,7 @@ fn should_encode_type(tcx: TyCtxt<'_>, def_id: LocalDefId, def_kind: DefKind) ->
let origin = tcx.opaque_type_origin(def_id); let origin = tcx.opaque_type_origin(def_id);
if let hir::OpaqueTyOrigin::FnReturn(fn_def_id) if let hir::OpaqueTyOrigin::FnReturn(fn_def_id)
| hir::OpaqueTyOrigin::AsyncFn(fn_def_id) = origin | hir::OpaqueTyOrigin::AsyncFn(fn_def_id) = origin
&& let hir::Node::TraitItem(trait_item) = tcx.hir().get_by_def_id(fn_def_id) && let hir::Node::TraitItem(trait_item) = tcx.hir_node_by_def_id(fn_def_id)
&& let (_, hir::TraitFn::Required(..)) = trait_item.expect_fn() && let (_, hir::TraitFn::Required(..)) = trait_item.expect_fn()
{ {
false false
@ -1161,7 +1161,7 @@ fn should_encode_type(tcx: TyCtxt<'_>, def_id: LocalDefId, def_kind: DefKind) ->
} }
} }
DefKind::TyParam => { DefKind::TyParam => {
let hir::Node::GenericParam(param) = tcx.hir().get_by_def_id(def_id) else { bug!() }; let hir::Node::GenericParam(param) = tcx.hir_node_by_def_id(def_id) else { bug!() };
let hir::GenericParamKind::Type { default, .. } = param.kind else { bug!() }; let hir::GenericParamKind::Type { default, .. } = param.kind else { bug!() };
default.is_some() default.is_some()
} }
@ -1372,7 +1372,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
// anonymous constants will not work on them and panic. It's not clear whether it // anonymous constants will not work on them and panic. It's not clear whether it
// can cause any observable issues or not. // can cause any observable issues or not.
let anon_const_without_hir = def_kind == DefKind::AnonConst let anon_const_without_hir = def_kind == DefKind::AnonConst
&& tcx.hir().find(tcx.local_def_id_to_hir_id(local_id)).is_none(); && tcx.opt_hir_node(tcx.local_def_id_to_hir_id(local_id)).is_none();
if should_encode_generics(def_kind) && !anon_const_without_hir { if should_encode_generics(def_kind) && !anon_const_without_hir {
let g = tcx.generics_of(def_id); let g = tcx.generics_of(def_id);
record!(self.tables.generics_of[def_id] <- g); record!(self.tables.generics_of[def_id] <- g);

View File

@ -57,6 +57,10 @@ fn is_body_owner(node: Node<'_>, hir_id: HirId) -> bool {
} }
} }
// FIXME: the structure was necessary in the past but now it
// only serves as "namespace" for HIR-related methods, and can be
// removed if all the methods are reasonably renamed and moved to tcx
// (https://github.com/rust-lang/rust/pull/118256#issuecomment-1826442834).
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct Map<'hir> { pub struct Map<'hir> {
pub(super) tcx: TyCtxt<'hir>, pub(super) tcx: TyCtxt<'hir>,
@ -128,6 +132,40 @@ impl<'hir> Iterator for ParentOwnerIterator<'hir> {
} }
} }
impl<'tcx> TyCtxt<'tcx> {
/// Retrieves the `hir::Node` corresponding to `id`, returning `None` if cannot be found.
pub fn opt_hir_node(self, id: HirId) -> Option<Node<'tcx>> {
if id.local_id == ItemLocalId::from_u32(0) {
let owner = self.hir_owner(id.owner)?;
Some(owner.node.into())
} else {
let owner = self.hir_owner_nodes(id.owner).as_owner()?;
let node = owner.nodes[id.local_id].as_ref()?;
Some(node.node)
}
}
/// Retrieves the `hir::Node` corresponding to `id`, returning `None` if cannot be found.
#[inline]
pub fn opt_hir_node_by_def_id(self, id: LocalDefId) -> Option<Node<'tcx>> {
self.opt_hir_node(self.opt_local_def_id_to_hir_id(id)?)
}
/// Retrieves the `hir::Node` corresponding to `id`, panicking if it cannot be found.
#[track_caller]
pub fn hir_node(self, id: HirId) -> Node<'tcx> {
self.opt_hir_node(id).unwrap_or_else(|| bug!("couldn't find HIR node for hir id {id:?}"))
}
/// Retrieves the `hir::Node` corresponding to `id`, panicking if it cannot be found.
#[inline]
#[track_caller]
pub fn hir_node_by_def_id(self, id: LocalDefId) -> Node<'tcx> {
self.opt_hir_node_by_def_id(id)
.unwrap_or_else(|| bug!("couldn't find HIR node for def id {id:?}"))
}
}
impl<'hir> Map<'hir> { impl<'hir> Map<'hir> {
#[inline] #[inline]
pub fn krate(self) -> &'hir Crate<'hir> { pub fn krate(self) -> &'hir Crate<'hir> {
@ -191,46 +229,15 @@ impl<'hir> Map<'hir> {
} }
pub fn get_parent(self, hir_id: HirId) -> Node<'hir> { pub fn get_parent(self, hir_id: HirId) -> Node<'hir> {
self.get(self.parent_id(hir_id)) self.tcx.hir_node(self.parent_id(hir_id))
} }
pub fn find_parent(self, hir_id: HirId) -> Option<Node<'hir>> { pub fn find_parent(self, hir_id: HirId) -> Option<Node<'hir>> {
self.find(self.opt_parent_id(hir_id)?) self.tcx.opt_hir_node(self.opt_parent_id(hir_id)?)
}
/// Retrieves the `Node` corresponding to `id`, returning `None` if cannot be found.
pub fn find(self, id: HirId) -> Option<Node<'hir>> {
if id.local_id == ItemLocalId::from_u32(0) {
let owner = self.tcx.hir_owner(id.owner)?;
Some(owner.node.into())
} else {
let owner = self.tcx.hir_owner_nodes(id.owner).as_owner()?;
let node = owner.nodes[id.local_id].as_ref()?;
Some(node.node)
}
}
/// Retrieves the `Node` corresponding to `id`, returning `None` if cannot be found.
#[inline]
pub fn find_by_def_id(self, id: LocalDefId) -> Option<Node<'hir>> {
self.find(self.tcx.opt_local_def_id_to_hir_id(id)?)
}
/// Retrieves the `Node` corresponding to `id`, panicking if it cannot be found.
#[track_caller]
pub fn get(self, id: HirId) -> Node<'hir> {
self.find(id).unwrap_or_else(|| bug!("couldn't find hir id {} in the HIR map", id))
}
/// Retrieves the `Node` corresponding to `id`, panicking if it cannot be found.
#[inline]
#[track_caller]
pub fn get_by_def_id(self, id: LocalDefId) -> Node<'hir> {
self.find_by_def_id(id).unwrap_or_else(|| bug!("couldn't find {:?} in the HIR map", id))
} }
pub fn get_if_local(self, id: DefId) -> Option<Node<'hir>> { pub fn get_if_local(self, id: DefId) -> Option<Node<'hir>> {
id.as_local().and_then(|id| self.find(self.tcx.opt_local_def_id_to_hir_id(id)?)) id.as_local().and_then(|id| self.tcx.opt_hir_node(self.tcx.opt_local_def_id_to_hir_id(id)?))
} }
pub fn get_generics(self, id: LocalDefId) -> Option<&'hir Generics<'hir>> { pub fn get_generics(self, id: LocalDefId) -> Option<&'hir Generics<'hir>> {
@ -264,7 +271,7 @@ impl<'hir> Map<'hir> {
#[track_caller] #[track_caller]
pub fn fn_decl_by_hir_id(self, hir_id: HirId) -> Option<&'hir FnDecl<'hir>> { pub fn fn_decl_by_hir_id(self, hir_id: HirId) -> Option<&'hir FnDecl<'hir>> {
if let Some(node) = self.find(hir_id) { if let Some(node) = self.tcx.opt_hir_node(hir_id) {
node.fn_decl() node.fn_decl()
} else { } else {
bug!("no node for hir_id `{}`", hir_id) bug!("no node for hir_id `{}`", hir_id)
@ -273,7 +280,7 @@ impl<'hir> Map<'hir> {
#[track_caller] #[track_caller]
pub fn fn_sig_by_hir_id(self, hir_id: HirId) -> Option<&'hir FnSig<'hir>> { pub fn fn_sig_by_hir_id(self, hir_id: HirId) -> Option<&'hir FnSig<'hir>> {
if let Some(node) = self.find(hir_id) { if let Some(node) = self.tcx.opt_hir_node(hir_id) {
node.fn_sig() node.fn_sig()
} else { } else {
bug!("no node for hir_id `{}`", hir_id) bug!("no node for hir_id `{}`", hir_id)
@ -296,19 +303,22 @@ impl<'hir> Map<'hir> {
/// item (possibly associated), a closure, or a `hir::AnonConst`. /// item (possibly associated), a closure, or a `hir::AnonConst`.
pub fn body_owner(self, BodyId { hir_id }: BodyId) -> HirId { pub fn body_owner(self, BodyId { hir_id }: BodyId) -> HirId {
let parent = self.parent_id(hir_id); let parent = self.parent_id(hir_id);
assert!(self.find(parent).is_some_and(|n| is_body_owner(n, hir_id)), "{hir_id:?}"); assert!(
self.tcx.opt_hir_node(parent).is_some_and(|n| is_body_owner(n, hir_id)),
"{hir_id:?}"
);
parent parent
} }
pub fn body_owner_def_id(self, BodyId { hir_id }: BodyId) -> LocalDefId { pub fn body_owner_def_id(self, BodyId { hir_id }: BodyId) -> LocalDefId {
let parent = self.parent_id(hir_id); let parent = self.parent_id(hir_id);
associated_body(self.get(parent)).unwrap().0 associated_body(self.tcx.hir_node(parent)).unwrap().0
} }
/// Given a `LocalDefId`, returns the `BodyId` associated with it, /// Given a `LocalDefId`, returns the `BodyId` associated with it,
/// if the node is a body owner, otherwise returns `None`. /// if the node is a body owner, otherwise returns `None`.
pub fn maybe_body_owned_by(self, id: LocalDefId) -> Option<BodyId> { pub fn maybe_body_owned_by(self, id: LocalDefId) -> Option<BodyId> {
let node = self.find_by_def_id(id)?; let node = self.tcx.opt_hir_node_by_def_id(id)?;
let (_, body_id) = associated_body(node)?; let (_, body_id) = associated_body(node)?;
Some(body_id) Some(body_id)
} }
@ -548,7 +558,7 @@ impl<'hir> Map<'hir> {
/// until the crate root is reached. Prefer this over your own loop using `parent_id`. /// until the crate root is reached. Prefer this over your own loop using `parent_id`.
#[inline] #[inline]
pub fn parent_iter(self, current_id: HirId) -> impl Iterator<Item = (HirId, Node<'hir>)> { 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)?))) self.parent_id_iter(current_id).filter_map(move |id| Some((id, self.tcx.opt_hir_node(id)?)))
} }
/// Returns an iterator for the nodes in the ancestor tree of the `current_id` /// Returns an iterator for the nodes in the ancestor tree of the `current_id`
@ -600,7 +610,7 @@ impl<'hir> Map<'hir> {
pub fn get_return_block(self, id: HirId) -> Option<HirId> { pub fn get_return_block(self, id: HirId) -> Option<HirId> {
let mut iter = self.parent_iter(id).peekable(); let mut iter = self.parent_iter(id).peekable();
let mut ignore_tail = false; let mut ignore_tail = false;
if let Some(Node::Expr(Expr { kind: ExprKind::Ret(_), .. })) = self.find(id) { if let Some(Node::Expr(Expr { kind: ExprKind::Ret(_), .. })) = self.tcx.opt_hir_node(id) {
// When dealing with `return` statements, we don't care about climbing only tail // When dealing with `return` statements, we don't care about climbing only tail
// expressions. // expressions.
ignore_tail = true; ignore_tail = true;
@ -708,7 +718,7 @@ impl<'hir> Map<'hir> {
let mut scope = id; let mut scope = id;
loop { loop {
scope = self.get_enclosing_scope(scope).unwrap_or(CRATE_HIR_ID); scope = self.get_enclosing_scope(scope).unwrap_or(CRATE_HIR_ID);
if scope == CRATE_HIR_ID || !matches!(self.get(scope), Node::Block(_)) { if scope == CRATE_HIR_ID || !matches!(self.tcx.hir_node(scope), Node::Block(_)) {
return scope; return scope;
} }
} }
@ -764,7 +774,7 @@ impl<'hir> Map<'hir> {
} }
pub fn expect_variant(self, id: HirId) -> &'hir Variant<'hir> { pub fn expect_variant(self, id: HirId) -> &'hir Variant<'hir> {
match self.find(id) { match self.tcx.opt_hir_node(id) {
Some(Node::Variant(variant)) => variant, Some(Node::Variant(variant)) => variant,
_ => bug!("expected variant, found {}", self.node_to_string(id)), _ => bug!("expected variant, found {}", self.node_to_string(id)),
} }
@ -783,7 +793,7 @@ impl<'hir> Map<'hir> {
} }
pub fn expect_expr(self, id: HirId) -> &'hir Expr<'hir> { pub fn expect_expr(self, id: HirId) -> &'hir Expr<'hir> {
match self.find(id) { match self.tcx.opt_hir_node(id) {
Some(Node::Expr(expr)) => expr, Some(Node::Expr(expr)) => expr,
_ => bug!("expected expr, found {}", self.node_to_string(id)), _ => bug!("expected expr, found {}", self.node_to_string(id)),
} }
@ -791,7 +801,7 @@ impl<'hir> Map<'hir> {
#[inline] #[inline]
fn opt_ident(self, id: HirId) -> Option<Ident> { fn opt_ident(self, id: HirId) -> Option<Ident> {
match self.find(id)? { match self.tcx.opt_hir_node(id)? {
Node::Pat(&Pat { kind: PatKind::Binding(_, _, ident, _), .. }) => Some(ident), Node::Pat(&Pat { kind: PatKind::Binding(_, _, ident, _), .. }) => Some(ident),
// A `Ctor` doesn't have an identifier itself, but its parent // A `Ctor` doesn't have an identifier itself, but its parent
// struct/variant does. Compare with `hir::Map::opt_span`. // struct/variant does. Compare with `hir::Map::opt_span`.
@ -860,7 +870,7 @@ impl<'hir> Map<'hir> {
} }
} }
let span = match self.find(hir_id)? { let span = match self.tcx.opt_hir_node(hir_id)? {
// Function-like. // Function-like.
Node::Item(Item { kind: ItemKind::Fn(sig, ..), span: outer_span, .. }) Node::Item(Item { kind: ItemKind::Fn(sig, ..), span: outer_span, .. })
| Node::TraitItem(TraitItem { | Node::TraitItem(TraitItem {
@ -950,7 +960,7 @@ impl<'hir> Map<'hir> {
/// Like `hir.span()`, but includes the body of items /// Like `hir.span()`, but includes the body of items
/// (instead of just the item header) /// (instead of just the item header)
pub fn span_with_body(self, hir_id: HirId) -> Span { pub fn span_with_body(self, hir_id: HirId) -> Span {
match self.get(hir_id) { match self.tcx.hir_node(hir_id) {
Node::Param(param) => param.span, Node::Param(param) => param.span,
Node::Item(item) => item.span, Node::Item(item) => item.span,
Node::ForeignItem(foreign_item) => foreign_item.span, Node::ForeignItem(foreign_item) => foreign_item.span,
@ -1045,7 +1055,7 @@ impl<'hir> Map<'hir> {
impl<'hir> intravisit::Map<'hir> for Map<'hir> { impl<'hir> intravisit::Map<'hir> for Map<'hir> {
fn find(&self, hir_id: HirId) -> Option<Node<'hir>> { fn find(&self, hir_id: HirId) -> Option<Node<'hir>> {
(*self).find(hir_id) self.tcx.opt_hir_node(hir_id)
} }
fn body(&self, id: BodyId) -> &'hir Body<'hir> { fn body(&self, id: BodyId) -> &'hir Body<'hir> {
@ -1159,7 +1169,7 @@ fn hir_id_to_string(map: Map<'_>, id: HirId) -> String {
let span_str = || map.tcx.sess.source_map().span_to_snippet(map.span(id)).unwrap_or_default(); let span_str = || map.tcx.sess.source_map().span_to_snippet(map.span(id)).unwrap_or_default();
let node_str = |prefix| format!("{id} ({prefix} `{}`)", span_str()); let node_str = |prefix| format!("{id} ({prefix} `{}`)", span_str());
match map.find(id) { match map.tcx.opt_hir_node(id) {
Some(Node::Item(item)) => { Some(Node::Item(item)) => {
let item_str = match item.kind { let item_str = match item.kind {
ItemKind::ExternCrate(..) => "extern crate", ItemKind::ExternCrate(..) => "extern crate",

View File

@ -195,7 +195,7 @@ pub fn provide(providers: &mut Providers) {
| Node::ForeignItem(&ForeignItem { | Node::ForeignItem(&ForeignItem {
kind: ForeignItemKind::Fn(_, idents, _), kind: ForeignItemKind::Fn(_, idents, _),
.. ..
}) = hir.get(hir_id) }) = tcx.hir_node(hir_id)
{ {
idents idents
} else { } else {

View File

@ -180,7 +180,7 @@ impl Scope {
}; };
let span = tcx.hir().span(hir_id); let span = tcx.hir().span(hir_id);
if let ScopeData::Remainder(first_statement_index) = self.data { if let ScopeData::Remainder(first_statement_index) = self.data {
if let Node::Block(blk) = tcx.hir().get(hir_id) { if let Node::Block(blk) = tcx.hir_node(hir_id) {
// Want span for scope starting after the // Want span for scope starting after the
// indexed statement and ending at end of // indexed statement and ending at end of
// `blk`; reuse span of `blk` and shift `lo` // `blk`; reuse span of `blk` and shift `lo`

View File

@ -219,7 +219,7 @@ fn late_report_deprecation(
} }
let method_span = method_span.unwrap_or(span); let method_span = method_span.unwrap_or(span);
tcx.struct_span_lint_hir(lint, hir_id, method_span, message, |diag| { tcx.struct_span_lint_hir(lint, hir_id, method_span, message, |diag| {
if let hir::Node::Expr(_) = tcx.hir().get(hir_id) { if let hir::Node::Expr(_) = tcx.hir_node(hir_id) {
let kind = tcx.def_descr(def_id); let kind = tcx.def_descr(def_id);
deprecation_suggestion(diag, kind, suggestion, method_span); deprecation_suggestion(diag, kind, suggestion, method_span);
} }

View File

@ -167,7 +167,7 @@ impl<'tcx> Const<'tcx> {
/// becomes `Unevaluated`. /// becomes `Unevaluated`.
#[instrument(skip(tcx), level = "debug")] #[instrument(skip(tcx), level = "debug")]
pub fn from_anon_const(tcx: TyCtxt<'tcx>, def: LocalDefId) -> Self { pub fn from_anon_const(tcx: TyCtxt<'tcx>, def: LocalDefId) -> Self {
let body_id = match tcx.hir().get_by_def_id(def) { let body_id = match tcx.hir_node_by_def_id(def) {
hir::Node::AnonConst(ac) => ac.body, hir::Node::AnonConst(ac) => ac.body,
_ => span_bug!( _ => span_bug!(
tcx.def_span(def.to_def_id()), tcx.def_span(def.to_def_id()),
@ -443,7 +443,7 @@ impl<'tcx> Const<'tcx> {
} }
pub fn const_param_default(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Const<'_>> { pub fn const_param_default(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Const<'_>> {
let default_def_id = match tcx.hir().get_by_def_id(def_id) { let default_def_id = match tcx.hir_node_by_def_id(def_id) {
hir::Node::GenericParam(hir::GenericParam { hir::Node::GenericParam(hir::GenericParam {
kind: hir::GenericParamKind::Const { default: Some(ac), .. }, kind: hir::GenericParamKind::Const { default: Some(ac), .. },
.. ..

View File

@ -1174,7 +1174,7 @@ impl<'tcx> TyCtxt<'tcx> {
break (scope, ty::BrNamed(def_id.into(), self.item_name(def_id.into()))); break (scope, ty::BrNamed(def_id.into(), self.item_name(def_id.into())));
}; };
let is_impl_item = match self.hir().find_by_def_id(suitable_region_binding_scope) { let is_impl_item = match self.opt_hir_node_by_def_id(suitable_region_binding_scope) {
Some(Node::Item(..) | Node::TraitItem(..)) => false, Some(Node::Item(..) | Node::TraitItem(..)) => false,
Some(Node::ImplItem(..)) => { Some(Node::ImplItem(..)) => {
self.is_bound_region_in_impl_item(suitable_region_binding_scope) self.is_bound_region_in_impl_item(suitable_region_binding_scope)
@ -1217,8 +1217,8 @@ impl<'tcx> TyCtxt<'tcx> {
None, None,
hir::Path { res: hir::def::Res::Def(DefKind::TyAlias, def_id), .. }, )) = hir_output.kind hir::Path { res: hir::def::Res::Def(DefKind::TyAlias, def_id), .. }, )) = hir_output.kind
&& let Some(local_id) = def_id.as_local() && let Some(local_id) = def_id.as_local()
&& let Some(alias_ty) = self.hir().get_by_def_id(local_id).alias_ty() // it is type alias && let Some(alias_ty) = self.hir_node_by_def_id(local_id).alias_ty() // it is type alias
&& let Some(alias_generics) = self.hir().get_by_def_id(local_id).generics() && let Some(alias_generics) = self.hir_node_by_def_id(local_id).generics()
{ {
v.visit_ty(alias_ty); v.visit_ty(alias_ty);
if !v.0.is_empty() { if !v.0.is_empty() {
@ -2137,7 +2137,7 @@ impl<'tcx> TyCtxt<'tcx> {
loop { loop {
let parent = self.local_parent(rpit_lifetime_param_def_id); let parent = self.local_parent(rpit_lifetime_param_def_id);
let hir::OpaqueTy { lifetime_mapping, .. } = let hir::OpaqueTy { lifetime_mapping, .. } =
self.hir().get_by_def_id(parent).expect_item().expect_opaque_ty(); self.hir_node_by_def_id(parent).expect_item().expect_opaque_ty();
let Some((lifetime, _)) = lifetime_mapping let Some((lifetime, _)) = lifetime_mapping
.iter() .iter()
@ -2221,8 +2221,7 @@ impl<'tcx> TyCtxt<'tcx> {
/// Whether the trait impl is marked const. This does not consider stability or feature gates. /// Whether the trait impl is marked const. This does not consider stability or feature gates.
pub fn is_const_trait_impl_raw(self, def_id: DefId) -> bool { pub fn is_const_trait_impl_raw(self, def_id: DefId) -> bool {
let Some(local_def_id) = def_id.as_local() else { return false }; let Some(local_def_id) = def_id.as_local() else { return false };
let hir_id = self.local_def_id_to_hir_id(local_def_id); let node = self.hir_node_by_def_id(local_def_id);
let node = self.hir().get(hir_id);
matches!( matches!(
node, node,

View File

@ -154,8 +154,9 @@ pub fn recursive_type_error(
let (_, field_id) = item_and_field_ids[i]; let (_, field_id) = item_and_field_ids[i];
let (next_item_id, _) = item_and_field_ids[(i + 1) % cycle_len]; let (next_item_id, _) = item_and_field_ids[(i + 1) % cycle_len];
// Find the span(s) that contain the next item in the cycle // Find the span(s) that contain the next item in the cycle
let hir_id = tcx.local_def_id_to_hir_id(field_id); let hir::Node::Field(field) = tcx.hir_node_by_def_id(field_id) else {
let hir::Node::Field(field) = tcx.hir().get(hir_id) else { bug!("expected field") }; bug!("expected field")
};
let mut found = Vec::new(); let mut found = Vec::new();
find_item_ty_spans(tcx, field.ty, next_item_id, &mut found, representable_ids); find_item_ty_spans(tcx, field.ty, next_item_id, &mut found, representable_ids);

View File

@ -572,7 +572,7 @@ fn construct_const<'a, 'tcx>(
let hir_id = tcx.local_def_id_to_hir_id(def); let hir_id = tcx.local_def_id_to_hir_id(def);
// Figure out what primary body this item has. // Figure out what primary body this item has.
let (span, const_ty_span) = match tcx.hir().get(hir_id) { let (span, const_ty_span) = match tcx.hir_node(hir_id) {
Node::Item(hir::Item { Node::Item(hir::Item {
kind: hir::ItemKind::Static(ty, _, _) | hir::ItemKind::Const(ty, _, _), kind: hir::ItemKind::Static(ty, _, _) | hir::ItemKind::Const(ty, _, _),
span, span,

View File

@ -110,7 +110,7 @@ impl<'tcx> Cx<'tcx> {
#[instrument(level = "debug", skip(self))] #[instrument(level = "debug", skip(self))]
fn pattern_from_hir(&mut self, p: &hir::Pat<'_>) -> Box<Pat<'tcx>> { fn pattern_from_hir(&mut self, p: &hir::Pat<'_>) -> Box<Pat<'tcx>> {
let p = match self.tcx.hir().get(p.hir_id) { let p = match self.tcx.hir_node(p.hir_id) {
Node::Pat(p) => p, Node::Pat(p) => p,
node => bug!("pattern became {:?}", node), node => bug!("pattern became {:?}", node),
}; };

View File

@ -50,7 +50,7 @@ impl<'tcx> MirPass<'tcx> for InstrumentCoverage {
} }
let is_fn_like = let is_fn_like =
tcx.hir().get_by_def_id(mir_source.def_id().expect_local()).fn_kind().is_some(); tcx.hir_node_by_def_id(mir_source.def_id().expect_local()).fn_kind().is_some();
// Only instrument functions, methods, and closures (not constants since they are evaluated // Only instrument functions, methods, and closures (not constants since they are evaluated
// at compile time by Miri). // at compile time by Miri).

View File

@ -604,7 +604,7 @@ impl CheckAttrVisitor<'_> {
&& !self.tcx.sess.target.is_like_wasm && !self.tcx.sess.target.is_like_wasm
&& !self.tcx.sess.opts.actually_rustdoc && !self.tcx.sess.opts.actually_rustdoc
{ {
let hir::Node::Item(item) = self.tcx.hir().get(hir_id) else { let hir::Node::Item(item) = self.tcx.hir_node(hir_id) else {
unreachable!(); unreachable!();
}; };
let hir::ItemKind::Fn(sig, _, _) = item.kind else { let hir::ItemKind::Fn(sig, _, _) = item.kind else {
@ -820,7 +820,7 @@ impl CheckAttrVisitor<'_> {
self.doc_attr_str_error(meta, "keyword"); self.doc_attr_str_error(meta, "keyword");
return false; return false;
} }
match self.tcx.hir().find(hir_id).and_then(|node| match node { match self.tcx.opt_hir_node(hir_id).and_then(|node| match node {
hir::Node::Item(item) => Some(&item.kind), hir::Node::Item(item) => Some(&item.kind),
_ => None, _ => None,
}) { }) {
@ -846,7 +846,7 @@ impl CheckAttrVisitor<'_> {
} }
fn check_doc_fake_variadic(&self, meta: &NestedMetaItem, hir_id: HirId) -> bool { fn check_doc_fake_variadic(&self, meta: &NestedMetaItem, hir_id: HirId) -> bool {
match self.tcx.hir().find(hir_id).and_then(|node| match node { match self.tcx.opt_hir_node(hir_id).and_then(|node| match node {
hir::Node::Item(item) => Some(&item.kind), hir::Node::Item(item) => Some(&item.kind),
_ => None, _ => None,
}) { }) {
@ -1387,7 +1387,7 @@ impl CheckAttrVisitor<'_> {
/// Checks if `#[link]` is applied to an item other than a foreign module. /// Checks if `#[link]` is applied to an item other than a foreign module.
fn check_link(&self, hir_id: HirId, attr: &Attribute, span: Span, target: Target) { fn check_link(&self, hir_id: HirId, attr: &Attribute, span: Span, target: Target) {
if target == Target::ForeignMod if target == Target::ForeignMod
&& let hir::Node::Item(item) = self.tcx.hir().get(hir_id) && let hir::Node::Item(item) = self.tcx.hir_node(hir_id)
&& let Item { kind: ItemKind::ForeignMod { abi, .. }, .. } = item && let Item { kind: ItemKind::ForeignMod { abi, .. }, .. } = item
&& !matches!(abi, Abi::Rust | Abi::RustIntrinsic | Abi::PlatformIntrinsic) && !matches!(abi, Abi::Rust | Abi::RustIntrinsic | Abi::PlatformIntrinsic)
{ {
@ -1456,7 +1456,7 @@ impl CheckAttrVisitor<'_> {
} }
fn is_impl_item(&self, hir_id: HirId) -> bool { fn is_impl_item(&self, hir_id: HirId) -> bool {
matches!(self.tcx.hir().get(hir_id), hir::Node::ImplItem(..)) matches!(self.tcx.hir_node(hir_id), hir::Node::ImplItem(..))
} }
/// Checks if `#[export_name]` is applied to a function or static. Returns `true` if valid. /// Checks if `#[export_name]` is applied to a function or static. Returns `true` if valid.
@ -2074,7 +2074,7 @@ impl CheckAttrVisitor<'_> {
&& let hir::Node::Item(Item { && let hir::Node::Item(Item {
kind: ItemKind::ForeignMod { abi: Abi::RustIntrinsic | Abi::PlatformIntrinsic, .. }, kind: ItemKind::ForeignMod { abi: Abi::RustIntrinsic | Abi::PlatformIntrinsic, .. },
.. ..
}) = hir.get(parent) }) = self.tcx.hir_node(parent)
{ {
return true; return true;
} }
@ -2222,7 +2222,7 @@ impl CheckAttrVisitor<'_> {
} else { } else {
// special case when `#[macro_export]` is applied to a macro 2.0 // special case when `#[macro_export]` is applied to a macro 2.0
let (macro_definition, _) = let (macro_definition, _) =
self.tcx.hir().find(hir_id).unwrap().expect_item().expect_macro(); self.tcx.opt_hir_node(hir_id).unwrap().expect_item().expect_macro();
let is_decl_macro = !macro_definition.macro_rules; let is_decl_macro = !macro_definition.macro_rules;
if is_decl_macro { if is_decl_macro {

View File

@ -32,7 +32,7 @@ use crate::errors::{
// may need to be marked as live. // may need to be marked as live.
fn should_explore(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool { fn should_explore(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
matches!( matches!(
tcx.hir().find_by_def_id(def_id), tcx.opt_hir_node_by_def_id(def_id),
Some( Some(
Node::Item(..) Node::Item(..)
| Node::ImplItem(..) | Node::ImplItem(..)
@ -297,7 +297,7 @@ impl<'tcx> MarkSymbolVisitor<'tcx> {
// tuple struct constructor function // tuple struct constructor function
let id = self.struct_constructors.get(&id).copied().unwrap_or(id); let id = self.struct_constructors.get(&id).copied().unwrap_or(id);
if let Some(node) = self.tcx.hir().find_by_def_id(id) { if let Some(node) = self.tcx.opt_hir_node_by_def_id(id) {
// When using `#[allow]` or `#[expect]` of `dead_code`, we do a QOL improvement // When using `#[allow]` or `#[expect]` of `dead_code`, we do a QOL improvement
// by declaring fn calls, statics, ... within said items as live, as well as // by declaring fn calls, statics, ... within said items as live, as well as
// the item itself, although technically this is not the case. // the item itself, although technically this is not the case.

View File

@ -126,7 +126,7 @@ fn configure_main(tcx: TyCtxt<'_>, visitor: &EntryContext<'_>) -> Option<(DefId,
{ {
// non-local main imports are handled below // non-local main imports are handled below
if let Some(def_id) = def_id.as_local() if let Some(def_id) = def_id.as_local()
&& matches!(tcx.hir().find_by_def_id(def_id), Some(Node::ForeignItem(_))) && matches!(tcx.opt_hir_node_by_def_id(def_id), Some(Node::ForeignItem(_)))
{ {
tcx.sess.emit_err(ExternMain { span: tcx.def_span(def_id) }); tcx.sess.emit_err(ExternMain { span: tcx.def_span(def_id) });
return None; return None;

View File

@ -155,7 +155,7 @@ impl<'tcx> LanguageItemCollector<'tcx> {
// have minimum requirements. // have minimum requirements.
if let hir::Node::Item(hir::Item { kind, span: item_span, .. }) = if let hir::Node::Item(hir::Item { kind, span: item_span, .. }) =
self.tcx.hir().get_by_def_id(item_def_id) self.tcx.hir_node_by_def_id(item_def_id)
{ {
let (actual_num, generics_span) = match kind.generics() { let (actual_num, generics_span) = match kind.generics() {
Some(generics) => ( Some(generics) => (

View File

@ -4,7 +4,6 @@ use rustc_hir as hir;
use rustc_hir::def_id::{LocalDefId, LocalModDefId}; use rustc_hir::def_id::{LocalDefId, LocalModDefId};
use rustc_hir::intravisit::{self, Visitor}; use rustc_hir::intravisit::{self, Visitor};
use rustc_hir::{Destination, Movability, Node}; use rustc_hir::{Destination, Movability, Node};
use rustc_middle::hir::map::Map;
use rustc_middle::hir::nested_filter; use rustc_middle::hir::nested_filter;
use rustc_middle::query::Providers; use rustc_middle::query::Providers;
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
@ -30,16 +29,16 @@ enum Context {
} }
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
struct CheckLoopVisitor<'a, 'hir> { struct CheckLoopVisitor<'a, 'tcx> {
sess: &'a Session, sess: &'a Session,
hir_map: Map<'hir>, tcx: TyCtxt<'tcx>,
cx: Context, cx: Context,
} }
fn check_mod_loops(tcx: TyCtxt<'_>, module_def_id: LocalModDefId) { fn check_mod_loops(tcx: TyCtxt<'_>, module_def_id: LocalModDefId) {
tcx.hir().visit_item_likes_in_module( tcx.hir().visit_item_likes_in_module(
module_def_id, module_def_id,
&mut CheckLoopVisitor { sess: tcx.sess, hir_map: tcx.hir(), cx: Normal }, &mut CheckLoopVisitor { sess: tcx.sess, tcx, cx: Normal },
); );
} }
@ -51,7 +50,7 @@ impl<'a, 'hir> Visitor<'hir> for CheckLoopVisitor<'a, 'hir> {
type NestedFilter = nested_filter::OnlyBodies; type NestedFilter = nested_filter::OnlyBodies;
fn nested_visit_map(&mut self) -> Self::Map { fn nested_visit_map(&mut self) -> Self::Map {
self.hir_map self.tcx.hir()
} }
fn visit_anon_const(&mut self, c: &'hir hir::AnonConst) { fn visit_anon_const(&mut self, c: &'hir hir::AnonConst) {
@ -136,13 +135,13 @@ impl<'a, 'hir> Visitor<'hir> for CheckLoopVisitor<'a, 'hir> {
Err(hir::LoopIdError::UnresolvedLabel) => None, Err(hir::LoopIdError::UnresolvedLabel) => None,
}; };
if let Some(Node::Block(_)) = loop_id.and_then(|id| self.hir_map.find(id)) { if let Some(Node::Block(_)) = loop_id.and_then(|id| self.tcx.opt_hir_node(id)) {
return; return;
} }
if let Some(break_expr) = opt_expr { if let Some(break_expr) = opt_expr {
let (head, loop_label, loop_kind) = if let Some(loop_id) = loop_id { let (head, loop_label, loop_kind) = if let Some(loop_id) = loop_id {
match self.hir_map.expect_expr(loop_id).kind { match self.tcx.hir().expect_expr(loop_id).kind {
hir::ExprKind::Loop(_, label, source, sp) => { hir::ExprKind::Loop(_, label, source, sp) => {
(Some(sp), label, Some(source)) (Some(sp), label, Some(source))
} }
@ -188,7 +187,7 @@ impl<'a, 'hir> Visitor<'hir> for CheckLoopVisitor<'a, 'hir> {
match destination.target_id { match destination.target_id {
Ok(loop_id) => { Ok(loop_id) => {
if let Node::Block(block) = self.hir_map.find(loop_id).unwrap() { if let Node::Block(block) = self.tcx.opt_hir_node(loop_id).unwrap() {
self.sess.emit_err(ContinueLabeledBlock { self.sess.emit_err(ContinueLabeledBlock {
span: e.span, span: e.span,
block_span: block.span, block_span: block.span,

View File

@ -35,7 +35,7 @@ fn check_mod_naked_functions(tcx: TyCtxt<'_>, module_def_id: LocalModDefId) {
continue; continue;
} }
let (fn_header, body_id) = match tcx.hir().get_by_def_id(def_id) { let (fn_header, body_id) = match tcx.hir_node_by_def_id(def_id) {
hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(sig, _, body_id), .. }) hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(sig, _, body_id), .. })
| hir::Node::TraitItem(hir::TraitItem { | hir::Node::TraitItem(hir::TraitItem {
kind: hir::TraitItemKind::Fn(sig, hir::TraitFn::Provided(body_id)), kind: hir::TraitItemKind::Fn(sig, hir::TraitFn::Provided(body_id)),

View File

@ -115,7 +115,7 @@ impl<'tcx> ReachableContext<'tcx> {
return false; return false;
}; };
match self.tcx.hir().find_by_def_id(def_id) { match self.tcx.opt_hir_node_by_def_id(def_id) {
Some(Node::Item(item)) => match item.kind { Some(Node::Item(item)) => match item.kind {
hir::ItemKind::Fn(..) => item_might_be_inlined(self.tcx, def_id.into()), hir::ItemKind::Fn(..) => item_might_be_inlined(self.tcx, def_id.into()),
_ => false, _ => false,
@ -146,7 +146,7 @@ impl<'tcx> ReachableContext<'tcx> {
continue; continue;
} }
if let Some(ref item) = self.tcx.hir().find_by_def_id(search_item) { if let Some(ref item) = self.tcx.opt_hir_node_by_def_id(search_item) {
self.propagate_node(item, search_item); self.propagate_node(item, search_item);
} }
} }

View File

@ -1783,7 +1783,7 @@ fn local_visibility(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Visibility {
Some(vis) => *vis, Some(vis) => *vis,
None => { None => {
let hir_id = tcx.local_def_id_to_hir_id(def_id); let hir_id = tcx.local_def_id_to_hir_id(def_id);
match tcx.hir().get(hir_id) { match tcx.hir_node(hir_id) {
// Unique types created for closures participate in type privacy checking. // Unique types created for closures participate in type privacy checking.
// They have visibilities inherited from the module they are defined in. // They have visibilities inherited from the module they are defined in.
Node::Expr(hir::Expr { kind: hir::ExprKind::Closure{..}, .. }) Node::Expr(hir::Expr { kind: hir::ExprKind::Closure{..}, .. })
@ -1800,7 +1800,7 @@ fn local_visibility(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Visibility {
// Visibilities of trait impl items are inherited from their traits // Visibilities of trait impl items are inherited from their traits
// and are not filled in resolve. // and are not filled in resolve.
Node::ImplItem(impl_item) => { Node::ImplItem(impl_item) => {
match tcx.hir().get_by_def_id(tcx.hir().get_parent_item(hir_id).def_id) { match tcx.hir_node_by_def_id(tcx.hir().get_parent_item(hir_id).def_id) {
Node::Item(hir::Item { Node::Item(hir::Item {
kind: hir::ItemKind::Impl(hir::Impl { of_trait: Some(tr), .. }), kind: hir::ItemKind::Impl(hir::Impl { of_trait: Some(tr), .. }),
.. ..

View File

@ -103,7 +103,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
/// to be the enclosing (async) block/function/closure /// to be the enclosing (async) block/function/closure
fn describe_enclosure(&self, hir_id: hir::HirId) -> Option<&'static str> { fn describe_enclosure(&self, hir_id: hir::HirId) -> Option<&'static str> {
let hir = self.tcx.hir(); let hir = self.tcx.hir();
let node = hir.find(hir_id)?; let node = self.tcx.opt_hir_node(hir_id)?;
match &node { match &node {
hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(sig, _, body_id), .. }) => { hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(sig, _, body_id), .. }) => {
self.describe_coroutine(*body_id).or_else(|| { self.describe_coroutine(*body_id).or_else(|| {

View File

@ -530,7 +530,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
// FIXME: Add check for trait bound that is already present, particularly `?Sized` so we // FIXME: Add check for trait bound that is already present, particularly `?Sized` so we
// don't suggest `T: Sized + ?Sized`. // don't suggest `T: Sized + ?Sized`.
while let Some(node) = self.tcx.hir().find_by_def_id(body_id) { while let Some(node) = self.tcx.opt_hir_node_by_def_id(body_id) {
match node { match node {
hir::Node::Item(hir::Item { hir::Node::Item(hir::Item {
ident, ident,
@ -732,7 +732,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
let Some(typeck_results) = &self.typeck_results else { let Some(typeck_results) = &self.typeck_results else {
return false; return false;
}; };
let hir::Node::Expr(expr) = self.tcx.hir().get(*arg_hir_id) else { let hir::Node::Expr(expr) = self.tcx.hir_node(*arg_hir_id) else {
return false; return false;
}; };
let Some(arg_ty) = typeck_results.expr_ty_adjusted_opt(expr) else { let Some(arg_ty) = typeck_results.expr_ty_adjusted_opt(expr) else {
@ -785,7 +785,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
kind: kind:
hir::ExprKind::AddrOf(hir::BorrowKind::Ref, hir::Mutability::Not, expr), hir::ExprKind::AddrOf(hir::BorrowKind::Ref, hir::Mutability::Not, expr),
.. ..
})) = self.tcx.hir().find(*arg_hir_id) })) = self.tcx.opt_hir_node(*arg_hir_id)
{ {
let derefs = "*".repeat(steps); let derefs = "*".repeat(steps);
err.span_suggestion_verbose( err.span_suggestion_verbose(
@ -821,7 +821,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
if self.predicate_may_hold(&obligation) if self.predicate_may_hold(&obligation)
&& self.predicate_must_hold_modulo_regions(&sized_obligation) && self.predicate_must_hold_modulo_regions(&sized_obligation)
{ {
let call_node = self.tcx.hir().get(*call_hir_id); let call_node = self.tcx.hir_node(*call_hir_id);
let msg = "consider dereferencing here"; let msg = "consider dereferencing here";
let is_receiver = matches!( let is_receiver = matches!(
call_node, call_node,
@ -1046,7 +1046,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
let Res::Local(hir_id) = path.res else { let Res::Local(hir_id) = path.res else {
return; return;
}; };
let Some(hir::Node::Pat(pat)) = self.tcx.hir().find(hir_id) else { let Some(hir::Node::Pat(pat)) = self.tcx.opt_hir_node(hir_id) else {
return; return;
}; };
let Some(hir::Node::Local(hir::Local { ty: None, init: Some(init), .. })) = let Some(hir::Node::Local(hir::Local { ty: None, init: Some(init), .. })) =
@ -1106,7 +1106,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
else { else {
return false; return false;
}; };
let arg_node = self.tcx.hir().get(*arg_hir_id); let arg_node = self.tcx.hir_node(*arg_hir_id);
let Node::Expr(Expr { kind: hir::ExprKind::Path(_), .. }) = arg_node else { return false }; let Node::Expr(Expr { kind: hir::ExprKind::Path(_), .. }) = arg_node else { return false };
let clone_trait = self.tcx.require_lang_item(LangItem::Clone, None); let clone_trait = self.tcx.require_lang_item(LangItem::Clone, None);
@ -1628,7 +1628,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
} }
if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = expr.kind if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = expr.kind
&& let Res::Local(hir_id) = path.res && let Res::Local(hir_id) = path.res
&& let Some(hir::Node::Pat(binding)) = self.tcx.hir().find(hir_id) && let Some(hir::Node::Pat(binding)) = self.tcx.opt_hir_node(hir_id)
&& let Some(hir::Node::Local(local)) = self.tcx.hir().find_parent(binding.hir_id) && let Some(hir::Node::Local(local)) = self.tcx.hir().find_parent(binding.hir_id)
&& let None = local.ty && let None = local.ty
&& let Some(binding_expr) = local.init && let Some(binding_expr) = local.init
@ -1644,7 +1644,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
fn suggest_remove_await(&self, obligation: &PredicateObligation<'tcx>, err: &mut Diagnostic) { fn suggest_remove_await(&self, obligation: &PredicateObligation<'tcx>, err: &mut Diagnostic) {
let hir = self.tcx.hir(); let hir = self.tcx.hir();
if let ObligationCauseCode::AwaitableExpr(hir_id) = obligation.cause.code().peel_derives() if let ObligationCauseCode::AwaitableExpr(hir_id) = obligation.cause.code().peel_derives()
&& let hir::Node::Expr(expr) = hir.get(*hir_id) && let hir::Node::Expr(expr) = self.tcx.hir_node(*hir_id)
{ {
// FIXME: use `obligation.predicate.kind()...trait_ref.self_ty()` to see if we have `()` // FIXME: use `obligation.predicate.kind()...trait_ref.self_ty()` to see if we have `()`
// and if not maybe suggest doing something else? If we kept the expression around we // and if not maybe suggest doing something else? If we kept the expression around we
@ -1794,7 +1794,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
trait_pred: ty::PolyTraitPredicate<'tcx>, trait_pred: ty::PolyTraitPredicate<'tcx>,
) -> bool { ) -> bool {
let hir = self.tcx.hir(); let hir = self.tcx.hir();
let node = hir.find_by_def_id(obligation.cause.body_id); let node = self.tcx.opt_hir_node_by_def_id(obligation.cause.body_id);
if let Some(hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(sig, _, body_id), .. })) = node if let Some(hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(sig, _, body_id), .. })) = node
&& let hir::ExprKind::Block(blk, _) = &hir.body(*body_id).value.kind && let hir::ExprKind::Block(blk, _) = &hir.body(*body_id).value.kind
&& sig.decl.output.span().overlaps(span) && sig.decl.output.span().overlaps(span)
@ -1829,9 +1829,8 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
} }
fn return_type_span(&self, obligation: &PredicateObligation<'tcx>) -> Option<Span> { fn return_type_span(&self, obligation: &PredicateObligation<'tcx>) -> Option<Span> {
let hir = self.tcx.hir();
let Some(hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(sig, ..), .. })) = let Some(hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(sig, ..), .. })) =
hir.find_by_def_id(obligation.cause.body_id) self.tcx.opt_hir_node_by_def_id(obligation.cause.body_id)
else { else {
return None; return None;
}; };
@ -1923,7 +1922,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
} }
let hir = self.tcx.hir(); let hir = self.tcx.hir();
let node = hir.find_by_def_id(obligation.cause.body_id); let node = self.tcx.opt_hir_node_by_def_id(obligation.cause.body_id);
if let Some(hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, _, body_id), .. })) = if let Some(hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, _, body_id), .. })) =
node node
{ {
@ -2041,7 +2040,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
let ty::FnPtr(found) = found.kind() else { let ty::FnPtr(found) = found.kind() else {
return; return;
}; };
let Some(Node::Expr(arg)) = self.tcx.hir().find(*arg_hir_id) else { let Some(Node::Expr(arg)) = self.tcx.opt_hir_node(*arg_hir_id) else {
return; return;
}; };
let hir::ExprKind::Path(path) = arg.kind else { let hir::ExprKind::Path(path) = arg.kind else {
@ -2986,7 +2985,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
} }
ObligationCauseCode::VariableType(hir_id) => { ObligationCauseCode::VariableType(hir_id) => {
let parent_node = self.tcx.hir().parent_id(hir_id); let parent_node = self.tcx.hir().parent_id(hir_id);
match self.tcx.hir().find(parent_node) { match self.tcx.opt_hir_node(parent_node) {
Some(Node::Local(hir::Local { ty: Some(ty), .. })) => { Some(Node::Local(hir::Local { ty: Some(ty), .. })) => {
err.span_suggestion_verbose( err.span_suggestion_verbose(
ty.span.shrink_to_lo(), ty.span.shrink_to_lo(),
@ -3130,7 +3129,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
"all values captured by value by a closure must have a statically known size", "all values captured by value by a closure must have a statically known size",
); );
let hir::ExprKind::Closure(closure) = let hir::ExprKind::Closure(closure) =
self.tcx.hir().get_by_def_id(closure_def_id).expect_expr().kind self.tcx.hir_node_by_def_id(closure_def_id).expect_expr().kind
else { else {
bug!("expected closure in SizedClosureCapture obligation"); bug!("expected closure in SizedClosureCapture obligation");
}; };
@ -3701,8 +3700,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
call_hir_id: HirId, call_hir_id: HirId,
) { ) {
let tcx = self.tcx; let tcx = self.tcx;
let hir = tcx.hir(); if let Some(Node::Expr(expr)) = tcx.opt_hir_node(arg_hir_id)
if let Some(Node::Expr(expr)) = hir.find(arg_hir_id)
&& let Some(typeck_results) = &self.typeck_results && let Some(typeck_results) = &self.typeck_results
{ {
if let hir::Expr { kind: hir::ExprKind::Block(block, _), .. } = expr { if let hir::Expr { kind: hir::ExprKind::Block(block, _), .. } = expr {
@ -3735,7 +3733,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
&& let hir::ExprKind::Closure(hir::Closure { && let hir::ExprKind::Closure(hir::Closure {
body, fn_decl_span, .. body, fn_decl_span, ..
}) = value.kind }) = value.kind
&& let body = hir.body(*body) && let body = tcx.hir().body(*body)
&& !matches!(body.value.kind, hir::ExprKind::Block(..)) && !matches!(body.value.kind, hir::ExprKind::Block(..))
{ {
// Check if the failed predicate was an expectation of a closure type // Check if the failed predicate was an expectation of a closure type
@ -3818,9 +3816,9 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
} }
if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = expr.kind if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = expr.kind
&& let hir::Path { res: Res::Local(hir_id), .. } = path && let hir::Path { res: Res::Local(hir_id), .. } = path
&& let Some(hir::Node::Pat(binding)) = self.tcx.hir().find(*hir_id) && let Some(hir::Node::Pat(binding)) = self.tcx.opt_hir_node(*hir_id)
&& let parent_hir_id = self.tcx.hir().parent_id(binding.hir_id) && let parent_hir_id = self.tcx.hir().parent_id(binding.hir_id)
&& let Some(hir::Node::Local(local)) = self.tcx.hir().find(parent_hir_id) && let Some(hir::Node::Local(local)) = self.tcx.opt_hir_node(parent_hir_id)
&& let Some(binding_expr) = local.init && let Some(binding_expr) = local.init
{ {
// If the expression we're calling on is a binding, we want to point at the // If the expression we're calling on is a binding, we want to point at the
@ -3831,7 +3829,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
self.point_at_chain(expr, typeck_results, type_diffs, param_env, err); self.point_at_chain(expr, typeck_results, type_diffs, param_env, err);
} }
} }
let call_node = hir.find(call_hir_id); let call_node = tcx.opt_hir_node(call_hir_id);
if let Some(Node::Expr(hir::Expr { if let Some(Node::Expr(hir::Expr {
kind: hir::ExprKind::MethodCall(path, rcvr, ..), .. kind: hir::ExprKind::MethodCall(path, rcvr, ..), ..
})) = call_node })) = call_node
@ -3841,7 +3839,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
} }
} }
if let Some(Node::Expr(expr)) = hir.find(call_hir_id) { if let Some(Node::Expr(expr)) = tcx.opt_hir_node(call_hir_id) {
if let hir::ExprKind::Call(hir::Expr { span, .. }, _) if let hir::ExprKind::Call(hir::Expr { span, .. }, _)
| hir::ExprKind::MethodCall( | hir::ExprKind::MethodCall(
hir::PathSegment { ident: Ident { span, .. }, .. }, hir::PathSegment { ident: Ident { span, .. }, .. },
@ -4002,7 +4000,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
continue; continue;
}; };
let hir = tcx.hir(); let hir = tcx.hir();
let node = hir.get_by_def_id(hir.get_parent_item(expr.hir_id).def_id); let node = tcx.hir_node_by_def_id(hir.get_parent_item(expr.hir_id).def_id);
let pred = ty::Binder::dummy(ty::TraitPredicate { let pred = ty::Binder::dummy(ty::TraitPredicate {
trait_ref: ty::TraitRef::from_lang_item( trait_ref: ty::TraitRef::from_lang_item(
@ -4078,7 +4076,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = expr.kind if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = expr.kind
&& let hir::Path { res: Res::Local(hir_id), .. } = path && let hir::Path { res: Res::Local(hir_id), .. } = path
&& let Some(hir::Node::Pat(binding)) = self.tcx.hir().find(*hir_id) && let Some(hir::Node::Pat(binding)) = self.tcx.opt_hir_node(*hir_id)
&& let Some(parent) = self.tcx.hir().find_parent(binding.hir_id) && let Some(parent) = self.tcx.hir().find_parent(binding.hir_id)
{ {
// We've reached the root of the method call chain... // We've reached the root of the method call chain...
@ -4457,7 +4455,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
} }
return; return;
}; };
let Some(hir::Node::TraitItem(item)) = self.tcx.hir().find_by_def_id(fn_def_id) else { let Some(hir::Node::TraitItem(item)) = self.tcx.opt_hir_node_by_def_id(fn_def_id) else {
return; return;
}; };
@ -4778,7 +4776,7 @@ pub fn suggest_desugaring_async_fn_to_impl_future_in_trait<'tcx>(
return None; return None;
}; };
let future = tcx.hir().get_by_def_id(opaque_def_id).expect_item().expect_opaque_ty(); let future = tcx.hir_node_by_def_id(opaque_def_id).expect_item().expect_opaque_ty();
let Some(hir::GenericBound::LangItemTrait(_, _, _, generics)) = future.bounds.get(0) else { let Some(hir::GenericBound::LangItemTrait(_, _, _, generics)) = future.bounds.get(0) else {
// `async fn` should always lower to a lang item bound... but don't ICE. // `async fn` should always lower to a lang item bound... but don't ICE.
return None; return None;

View File

@ -984,13 +984,13 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
fn fn_arg_obligation(&self, obligation: &PredicateObligation<'tcx>) -> bool { fn fn_arg_obligation(&self, obligation: &PredicateObligation<'tcx>) -> bool {
if let ObligationCauseCode::FunctionArgumentObligation { arg_hir_id, .. } = if let ObligationCauseCode::FunctionArgumentObligation { arg_hir_id, .. } =
obligation.cause.code() obligation.cause.code()
&& let Some(Node::Expr(arg)) = self.tcx.hir().find(*arg_hir_id) && let Some(Node::Expr(arg)) = self.tcx.opt_hir_node(*arg_hir_id)
&& let arg = arg.peel_borrows() && let arg = arg.peel_borrows()
&& let hir::ExprKind::Path(hir::QPath::Resolved( && let hir::ExprKind::Path(hir::QPath::Resolved(
None, None,
hir::Path { res: hir::def::Res::Local(hir_id), .. }, hir::Path { res: hir::def::Res::Local(hir_id), .. },
)) = arg.kind )) = arg.kind
&& let Some(Node::Pat(pat)) = self.tcx.hir().find(*hir_id) && let Some(Node::Pat(pat)) = self.tcx.opt_hir_node(*hir_id)
&& let Some(preds) = self.reported_trait_errors.borrow().get(&pat.span) && let Some(preds) = self.reported_trait_errors.borrow().get(&pat.span)
&& preds.contains(&obligation.predicate) && preds.contains(&obligation.predicate)
{ {
@ -1028,7 +1028,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
} }
} }
let hir_id = self.tcx.local_def_id_to_hir_id(obligation.cause.body_id); let hir_id = self.tcx.local_def_id_to_hir_id(obligation.cause.body_id);
let body_id = match self.tcx.hir().find(hir_id) { let body_id = match self.tcx.opt_hir_node(hir_id) {
Some(hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, _, body_id), .. })) => { Some(hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, _, body_id), .. })) => {
body_id body_id
} }
@ -1154,7 +1154,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = expr.kind if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = expr.kind
&& let hir::Path { res: hir::def::Res::Local(hir_id), .. } = path && let hir::Path { res: hir::def::Res::Local(hir_id), .. } = path
&& let Some(hir::Node::Pat(binding)) = self.tcx.hir().find(*hir_id) && let Some(hir::Node::Pat(binding)) = self.tcx.opt_hir_node(*hir_id)
&& let Some(parent) = self.tcx.hir().find_parent(binding.hir_id) && let Some(parent) = self.tcx.hir().find_parent(binding.hir_id)
{ {
// We've reached the root of the method call chain... // We've reached the root of the method call chain...
@ -2499,7 +2499,7 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
ident: trait_name, ident: trait_name,
kind: hir::ItemKind::Trait(_, _, _, _, trait_item_refs), kind: hir::ItemKind::Trait(_, _, _, _, trait_item_refs),
.. ..
})) = self.tcx.hir().find_by_def_id(local_def_id) })) = self.tcx.opt_hir_node_by_def_id(local_def_id)
&& let Some(method_ref) = trait_item_refs && let Some(method_ref) = trait_item_refs
.iter() .iter()
.find(|item_ref| item_ref.ident == *assoc_item_name) .find(|item_ref| item_ref.ident == *assoc_item_name)

View File

@ -345,8 +345,7 @@ fn associated_type_for_impl_trait_in_impl(
let impl_local_def_id = tcx.local_parent(impl_fn_def_id); let impl_local_def_id = tcx.local_parent(impl_fn_def_id);
let decl = tcx let decl = tcx
.hir() .opt_hir_node_by_def_id(impl_fn_def_id)
.find_by_def_id(impl_fn_def_id)
.expect("expected item") .expect("expected item")
.fn_decl() .fn_decl()
.expect("expected decl"); .expect("expected decl");

View File

@ -161,7 +161,7 @@ fn assumed_wf_types<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> &'tcx [(Ty<'
} }
fn fn_sig_spans(tcx: TyCtxt<'_>, def_id: LocalDefId) -> impl Iterator<Item = Span> + '_ { fn fn_sig_spans(tcx: TyCtxt<'_>, def_id: LocalDefId) -> impl Iterator<Item = Span> + '_ {
let node = tcx.hir().get(tcx.local_def_id_to_hir_id(def_id)); let node = tcx.hir_node_by_def_id(def_id);
if let Some(decl) = node.fn_decl() { if let Some(decl) = node.fn_decl() {
decl.inputs.iter().map(|ty| ty.span).chain(iter::once(decl.output.span())) decl.inputs.iter().map(|ty| ty.span).chain(iter::once(decl.output.span()))
} else { } else {

View File

@ -28,7 +28,7 @@ pub(crate) fn walk_types<'tcx, V: SpannedTypeVisitor<'tcx>>(
// Walk over the signature of the function // Walk over the signature of the function
DefKind::AssocFn | DefKind::Fn => { DefKind::AssocFn | DefKind::Fn => {
let ty_sig = tcx.fn_sig(item).instantiate_identity(); let ty_sig = tcx.fn_sig(item).instantiate_identity();
let hir_sig = tcx.hir().get_by_def_id(item).fn_decl().unwrap(); let hir_sig = tcx.hir_node_by_def_id(item).fn_decl().unwrap();
// Walk over the inputs and outputs manually in order to get good spans for them. // Walk over the inputs and outputs manually in order to get good spans for them.
visitor.visit(hir_sig.output.span(), ty_sig.output()); visitor.visit(hir_sig.output.span(), ty_sig.output());
for (hir, ty) in hir_sig.inputs.iter().zip(ty_sig.inputs().iter()) { for (hir, ty) in hir_sig.inputs.iter().zip(ty_sig.inputs().iter()) {
@ -42,7 +42,7 @@ pub(crate) fn walk_types<'tcx, V: SpannedTypeVisitor<'tcx>>(
DefKind::TyAlias {..} | DefKind::AssocTy | DefKind::TyAlias {..} | DefKind::AssocTy |
// Walk over the type of the item // Walk over the type of the item
DefKind::Static(_) | DefKind::Const | DefKind::AssocConst | DefKind::AnonConst => { DefKind::Static(_) | DefKind::Const | DefKind::AssocConst | DefKind::AnonConst => {
let span = match tcx.hir().get_by_def_id(item).ty() { let span = match tcx.hir_node_by_def_id(item).ty() {
Some(ty) => ty.span, Some(ty) => ty.span,
_ => tcx.def_span(item), _ => tcx.def_span(item),
}; };
@ -70,11 +70,11 @@ pub(crate) fn walk_types<'tcx, V: SpannedTypeVisitor<'tcx>>(
DefKind::InlineConst | DefKind::Closure => {} DefKind::InlineConst | DefKind::Closure => {}
DefKind::Impl { of_trait } => { DefKind::Impl { of_trait } => {
if of_trait { if of_trait {
let span = tcx.hir().get_by_def_id(item).expect_item().expect_impl().of_trait.unwrap().path.span; let span = tcx.hir_node_by_def_id(item).expect_item().expect_impl().of_trait.unwrap().path.span;
let args = &tcx.impl_trait_ref(item).unwrap().instantiate_identity().args[1..]; let args = &tcx.impl_trait_ref(item).unwrap().instantiate_identity().args[1..];
visitor.visit(span, args)?; visitor.visit(span, args)?;
} }
let span = match tcx.hir().get_by_def_id(item).ty() { let span = match tcx.hir_node_by_def_id(item).ty() {
Some(ty) => ty.span, Some(ty) => ty.span,
_ => tcx.def_span(item), _ => tcx.def_span(item),
}; };

View File

@ -74,7 +74,7 @@ fn sized_constraint_for_ty<'tcx>(
} }
fn defaultness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::Defaultness { fn defaultness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::Defaultness {
match tcx.hir().get_by_def_id(def_id) { match tcx.hir_node_by_def_id(def_id) {
hir::Node::Item(hir::Item { kind: hir::ItemKind::Impl(impl_), .. }) => impl_.defaultness, hir::Node::Item(hir::Item { kind: hir::ItemKind::Impl(impl_), .. }) => impl_.defaultness,
hir::Node::ImplItem(hir::ImplItem { defaultness, .. }) hir::Node::ImplItem(hir::ImplItem { defaultness, .. })
| hir::Node::TraitItem(hir::TraitItem { defaultness, .. }) => *defaultness, | hir::Node::TraitItem(hir::TraitItem { defaultness, .. }) => *defaultness,
@ -300,7 +300,7 @@ fn issue33140_self_ty(tcx: TyCtxt<'_>, def_id: DefId) -> Option<EarlyBinder<Ty<'
/// Check if a function is async. /// Check if a function is async.
fn asyncness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Asyncness { fn asyncness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Asyncness {
let node = tcx.hir().get_by_def_id(def_id); let node = tcx.hir_node_by_def_id(def_id);
node.fn_sig().map_or(ty::Asyncness::No, |sig| match sig.header.asyncness { node.fn_sig().map_or(ty::Asyncness::No, |sig| match sig.header.asyncness {
hir::IsAsync::Async(_) => ty::Asyncness::Yes, hir::IsAsync::Async(_) => ty::Asyncness::Yes,
hir::IsAsync::NotAsync => ty::Asyncness::No, hir::IsAsync::NotAsync => ty::Asyncness::No,

View File

@ -1596,7 +1596,6 @@ fn first_non_private<'tcx>(
// Absolute paths are not. We start from the parent of the item. // Absolute paths are not. We start from the parent of the item.
[.., parent, leaf] => (parent.res.opt_def_id()?.as_local()?, leaf.ident), [.., parent, leaf] => (parent.res.opt_def_id()?.as_local()?, leaf.ident),
}; };
let hir = cx.tcx.hir();
// First we try to get the `DefId` of the item. // First we try to get the `DefId` of the item.
for child in for child in
cx.tcx.module_children_local(parent_def_id).iter().filter(move |c| c.ident == ident) cx.tcx.module_children_local(parent_def_id).iter().filter(move |c| c.ident == ident)
@ -1612,7 +1611,8 @@ fn first_non_private<'tcx>(
'reexps: for reexp in child.reexport_chain.iter() { 'reexps: for reexp in child.reexport_chain.iter() {
if let Some(use_def_id) = reexp.id() if let Some(use_def_id) = reexp.id()
&& let Some(local_use_def_id) = use_def_id.as_local() && let Some(local_use_def_id) = use_def_id.as_local()
&& let Some(hir::Node::Item(item)) = hir.find_by_def_id(local_use_def_id) && let Some(hir::Node::Item(item)) =
cx.tcx.opt_hir_node_by_def_id(local_use_def_id)
&& !item.ident.name.is_empty() && !item.ident.name.is_empty()
&& let hir::ItemKind::Use(path, _) = item.kind && let hir::ItemKind::Use(path, _) = item.kind
{ {

View File

@ -439,7 +439,7 @@ fn print_const_with_custom_print_scalar<'tcx>(
} }
pub(crate) fn is_literal_expr(tcx: TyCtxt<'_>, hir_id: hir::HirId) -> bool { pub(crate) fn is_literal_expr(tcx: TyCtxt<'_>, hir_id: hir::HirId) -> bool {
if let hir::Node::Expr(expr) = tcx.hir().get(hir_id) { if let hir::Node::Expr(expr) = tcx.hir_node(hir_id) {
if let hir::ExprKind::Lit(_) = &expr.kind { if let hir::ExprKind::Lit(_) = &expr.kind {
return true; return true;
} }
@ -641,7 +641,6 @@ pub(crate) fn inherits_doc_hidden(
mut def_id: LocalDefId, mut def_id: LocalDefId,
stop_at: Option<LocalDefId>, stop_at: Option<LocalDefId>,
) -> bool { ) -> bool {
let hir = tcx.hir();
while let Some(id) = tcx.opt_local_parent(def_id) { while let Some(id) = tcx.opt_local_parent(def_id) {
if let Some(stop_at) = stop_at if let Some(stop_at) = stop_at
&& id == stop_at && id == stop_at
@ -651,7 +650,7 @@ pub(crate) fn inherits_doc_hidden(
def_id = id; def_id = id;
if tcx.is_doc_hidden(def_id.to_def_id()) { if tcx.is_doc_hidden(def_id.to_def_id()) {
return true; return true;
} else if let Some(node) = hir.find_by_def_id(def_id) } else if let Some(node) = tcx.opt_hir_node_by_def_id(def_id)
&& matches!(node, hir::Node::Item(hir::Item { kind: hir::ItemKind::Impl(_), .. }),) && matches!(node, hir::Node::Item(hir::Item { kind: hir::ItemKind::Impl(_), .. }),)
{ {
// `impl` blocks stand a bit on their own: unless they have `#[doc(hidden)]` directly // `impl` blocks stand a bit on their own: unless they have `#[doc(hidden)]` directly

View File

@ -94,7 +94,7 @@ impl<'tcx> SpanMapVisitor<'tcx> {
/// Used to generate links on items' definition to go to their documentation page. /// Used to generate links on items' definition to go to their documentation page.
pub(crate) fn extract_info_from_hir_id(&mut self, hir_id: HirId) { pub(crate) fn extract_info_from_hir_id(&mut self, hir_id: HirId) {
if let Some(Node::Item(item)) = self.tcx.hir().find(hir_id) { if let Some(Node::Item(item)) = self.tcx.opt_hir_node(hir_id) {
if let Some(span) = self.tcx.def_ident_span(item.owner_id) { if let Some(span) = self.tcx.def_ident_span(item.owner_id) {
let cspan = clean::Span::new(span); let cspan = clean::Span::new(span);
// If the span isn't from the current crate, we ignore it. // If the span isn't from the current crate, we ignore it.
@ -177,7 +177,7 @@ impl<'tcx> Visitor<'tcx> for SpanMapVisitor<'tcx> {
if !span.overlaps(m.spans.inner_span) { if !span.overlaps(m.spans.inner_span) {
// Now that we confirmed it's a file import, we want to get the span for the module // Now that we confirmed it's a file import, we want to get the span for the module
// name only and not all the "mod foo;". // name only and not all the "mod foo;".
if let Some(Node::Item(item)) = self.tcx.hir().find(id) { if let Some(Node::Item(item)) = self.tcx.opt_hir_node(id) {
self.matches.insert( self.matches.insert(
item.ident.span, item.ident.span,
LinkFromSrc::Local(clean::Span::new(m.spans.inner_span)), LinkFromSrc::Local(clean::Span::new(m.spans.inner_span)),

View File

@ -80,7 +80,7 @@ pub(crate) fn should_have_doc_example(cx: &DocContext<'_>, item: &clean::Item) -
// check if parent is trait impl // check if parent is trait impl
if let Some(parent_def_id) = cx.tcx.opt_local_parent(def_id) if let Some(parent_def_id) = cx.tcx.opt_local_parent(def_id)
&& let Some(parent_node) = cx.tcx.hir().find_by_def_id(parent_def_id) && let Some(parent_node) = cx.tcx.opt_hir_node_by_def_id(parent_def_id)
&& matches!( && matches!(
parent_node, parent_node,
hir::Node::Item(hir::Item { hir::Node::Item(hir::Item {

View File

@ -275,7 +275,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
}; };
let is_private = !self.cx.cache.effective_visibilities.is_directly_public(tcx, ori_res_did); let is_private = !self.cx.cache.effective_visibilities.is_directly_public(tcx, ori_res_did);
let item = tcx.hir().get_by_def_id(res_did); let item = tcx.hir_node_by_def_id(res_did);
if !please_inline { if !please_inline {
let inherits_hidden = !document_hidden && inherits_doc_hidden(tcx, res_did, None); let inherits_hidden = !document_hidden && inherits_doc_hidden(tcx, res_did, None);

View File

@ -62,7 +62,7 @@ impl LateLintPass<'_> for AbsolutePaths {
} = self; } = self;
if !path.span.from_expansion() if !path.span.from_expansion()
&& let Some(node) = cx.tcx.hir().find(hir_id) && let Some(node) = cx.tcx.opt_hir_node(hir_id)
&& !matches!(node, Node::Item(item) if matches!(item.kind, ItemKind::Use(_, _))) && !matches!(node, Node::Item(item) if matches!(item.kind, ItemKind::Use(_, _)))
&& let [first, rest @ ..] = path.segments && let [first, rest @ ..] = path.segments
// Handle `::std` // Handle `::std`

View File

@ -69,7 +69,7 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &Expr<'tcx>, msrv: &Msrv
fn is_child_of_cast(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool { fn is_child_of_cast(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
let map = cx.tcx.hir(); let map = cx.tcx.hir();
if let Some(parent_id) = map.opt_parent_id(expr.hir_id) if let Some(parent_id) = map.opt_parent_id(expr.hir_id)
&& let Some(parent) = map.find(parent_id) && let Some(parent) = cx.tcx.opt_hir_node(parent_id)
{ {
let expr = match parent { let expr = match parent {
Node::Block(block) => { Node::Block(block) => {

View File

@ -1090,7 +1090,7 @@ fn report<'tcx>(
if parent_id == data.first_expr.hir_id { if parent_id == data.first_expr.hir_id {
return; return;
} }
(cx.tcx.hir().get(parent_id).expect_expr().span, true) (cx.tcx.hir_node(parent_id).expect_expr().span, true)
} else { } else {
(expr.span, false) (expr.span, false)
}; };

View File

@ -195,7 +195,7 @@ impl<'tcx> LateLintPass<'tcx> for DerivableImpls {
&& let Some(def_id) = trait_ref.trait_def_id() && let Some(def_id) = trait_ref.trait_def_id()
&& cx.tcx.is_diagnostic_item(sym::Default, def_id) && cx.tcx.is_diagnostic_item(sym::Default, def_id)
&& let impl_item_hir = child.id.hir_id() && let impl_item_hir = child.id.hir_id()
&& let Some(Node::ImplItem(impl_item)) = cx.tcx.hir().find(impl_item_hir) && let Some(Node::ImplItem(impl_item)) = cx.tcx.opt_hir_node(impl_item_hir)
&& let ImplItemKind::Fn(_, b) = &impl_item.kind && let ImplItemKind::Fn(_, b) = &impl_item.kind
&& let Body { value: func_expr, .. } = cx.tcx.hir().body(*b) && let Body { value: func_expr, .. } = cx.tcx.hir().body(*b)
&& let &Adt(adt_def, args) = cx.tcx.type_of(item.owner_id).instantiate_identity().kind() && let &Adt(adt_def, args) = cx.tcx.type_of(item.owner_id).instantiate_identity().kind()

View File

@ -42,7 +42,7 @@ impl LateLintPass<'_> for EmptyDrop {
}) = item.kind }) = item.kind
&& trait_ref.trait_def_id() == cx.tcx.lang_items().drop_trait() && trait_ref.trait_def_id() == cx.tcx.lang_items().drop_trait()
&& let impl_item_hir = child.id.hir_id() && let impl_item_hir = child.id.hir_id()
&& let Some(Node::ImplItem(impl_item)) = cx.tcx.hir().find(impl_item_hir) && let Some(Node::ImplItem(impl_item)) = cx.tcx.opt_hir_node(impl_item_hir)
&& let ImplItemKind::Fn(_, b) = &impl_item.kind && let ImplItemKind::Fn(_, b) = &impl_item.kind
&& let Body { value: func_expr, .. } = cx.tcx.hir().body(*b) && let Body { value: func_expr, .. } = cx.tcx.hir().body(*b)
&& let func_expr = peel_blocks(func_expr) && let func_expr = peel_blocks(func_expr)

View File

@ -5,7 +5,7 @@ use rustc_infer::infer::TyCtxtInferExt;
use rustc_lint::{LateContext, LateLintPass}; use rustc_lint::{LateContext, LateLintPass};
use rustc_middle::mir::FakeReadCause; use rustc_middle::mir::FakeReadCause;
use rustc_middle::ty::layout::LayoutOf; use rustc_middle::ty::layout::LayoutOf;
use rustc_middle::ty::{self, TraitRef, Ty}; use rustc_middle::ty::{self, TraitRef, Ty, TyCtxt};
use rustc_session::impl_lint_pass; use rustc_session::impl_lint_pass;
use rustc_span::def_id::LocalDefId; use rustc_span::def_id::LocalDefId;
use rustc_span::symbol::kw; use rustc_span::symbol::kw;
@ -76,7 +76,7 @@ impl<'tcx> LateLintPass<'tcx> for BoxedLocal {
.hir() .hir()
.get_parent_item(cx.tcx.local_def_id_to_hir_id(fn_def_id)) .get_parent_item(cx.tcx.local_def_id_to_hir_id(fn_def_id))
.def_id; .def_id;
let parent_node = cx.tcx.hir().find_by_def_id(parent_id); let parent_node = cx.tcx.opt_hir_node_by_def_id(parent_id);
let mut trait_self_ty = None; let mut trait_self_ty = None;
if let Some(Node::Item(item)) = parent_node { if let Some(Node::Item(item)) = parent_node {
@ -122,8 +122,8 @@ impl<'tcx> LateLintPass<'tcx> for BoxedLocal {
} }
// TODO: Replace with Map::is_argument(..) when it's fixed // TODO: Replace with Map::is_argument(..) when it's fixed
fn is_argument(map: rustc_middle::hir::map::Map<'_>, id: HirId) -> bool { fn is_argument(tcx: TyCtxt<'_>, id: HirId) -> bool {
match map.find(id) { match tcx.opt_hir_node(id) {
Some(Node::Pat(Pat { Some(Node::Pat(Pat {
kind: PatKind::Binding(..), kind: PatKind::Binding(..),
.. ..
@ -131,7 +131,7 @@ fn is_argument(map: rustc_middle::hir::map::Map<'_>, id: HirId) -> bool {
_ => return false, _ => return false,
} }
matches!(map.find_parent(id), Some(Node::Param(_))) matches!(tcx.hir().find_parent(id), Some(Node::Param(_)))
} }
impl<'a, 'tcx> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> { impl<'a, 'tcx> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> {
@ -154,7 +154,7 @@ impl<'a, 'tcx> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> {
fn mutate(&mut self, cmt: &PlaceWithHirId<'tcx>, _: HirId) { fn mutate(&mut self, cmt: &PlaceWithHirId<'tcx>, _: HirId) {
if cmt.place.projections.is_empty() { if cmt.place.projections.is_empty() {
let map = &self.cx.tcx.hir(); let map = &self.cx.tcx.hir();
if is_argument(*map, cmt.hir_id) { if is_argument(self.cx.tcx, cmt.hir_id) {
// Skip closure arguments // Skip closure arguments
let parent_id = map.parent_id(cmt.hir_id); let parent_id = map.parent_id(cmt.hir_id);
if let Some(Node::Expr(..)) = map.find_parent(parent_id) { if let Some(Node::Expr(..)) = map.find_parent(parent_id) {

View File

@ -46,7 +46,7 @@ impl<'tcx> LateLintPass<'tcx> for Exit {
&& let Some(def_id) = cx.qpath_res(path, path_expr.hir_id).opt_def_id() && let Some(def_id) = cx.qpath_res(path, path_expr.hir_id).opt_def_id()
&& cx.tcx.is_diagnostic_item(sym::process_exit, def_id) && cx.tcx.is_diagnostic_item(sym::process_exit, def_id)
&& let parent = cx.tcx.hir().get_parent_item(e.hir_id).def_id && let parent = cx.tcx.hir().get_parent_item(e.hir_id).def_id
&& let Some(Node::Item(Item{kind: ItemKind::Fn(..), ..})) = cx.tcx.hir().find_by_def_id(parent) && let Some(Node::Item(Item{kind: ItemKind::Fn(..), ..})) = cx.tcx.opt_hir_node_by_def_id(parent)
// If the next item up is a function we check if it is an entry point // If the next item up is a function we check if it is an entry point
// and only then emit a linter warning // and only then emit a linter warning
&& !is_entrypoint_fn(cx, parent.to_def_id()) && !is_entrypoint_fn(cx, parent.to_def_id())

View File

@ -111,7 +111,7 @@ fn look_in_block<'tcx, 'hir>(cx: &LateContext<'tcx>, kind: &'tcx ExprKind<'hir>)
// Find id of the local that expr_end_of_block resolves to // Find id of the local that expr_end_of_block resolves to
&& let ExprKind::Path(QPath::Resolved(None, expr_path)) = expr_end_of_block.kind && let ExprKind::Path(QPath::Resolved(None, expr_path)) = expr_end_of_block.kind
&& let Res::Local(expr_res) = expr_path.res && let Res::Local(expr_res) = expr_path.res
&& let Some(Node::Pat(res_pat)) = cx.tcx.hir().find(expr_res) && let Some(Node::Pat(res_pat)) = cx.tcx.opt_hir_node(expr_res)
// Find id of the local we found in the block // Find id of the local we found in the block
&& let PatKind::Binding(BindingAnnotation::NONE, local_hir_id, _ident, None) = local.pat.kind && let PatKind::Binding(BindingAnnotation::NONE, local_hir_id, _ident, None) = local.pat.kind

View File

@ -92,7 +92,7 @@ fn check_result_large_err<'tcx>(cx: &LateContext<'tcx>, err_ty: Ty<'tcx>, hir_ty
.expect("already checked this is adt") .expect("already checked this is adt")
.did() .did()
.as_local() .as_local()
&& let Some(hir::Node::Item(item)) = cx.tcx.hir().find_by_def_id(local_def_id) && let Some(hir::Node::Item(item)) = cx.tcx.opt_hir_node_by_def_id(local_def_id)
&& let hir::ItemKind::Enum(ref def, _) = item.kind && let hir::ItemKind::Enum(ref def, _) = item.kind
{ {
let variants_size = AdtVariantInfo::new(cx, *adt, subst); let variants_size = AdtVariantInfo::new(cx, *adt, subst);

View File

@ -248,7 +248,7 @@ impl<'a, 'tcx> Visitor<'tcx> for SliceIndexLintingVisitor<'a, 'tcx> {
// Checking for slice indexing // Checking for slice indexing
&& let parent_id = map.parent_id(expr.hir_id) && let parent_id = map.parent_id(expr.hir_id)
&& let Some(hir::Node::Expr(parent_expr)) = map.find(parent_id) && let Some(hir::Node::Expr(parent_expr)) = cx.tcx.opt_hir_node(parent_id)
&& let hir::ExprKind::Index(_, index_expr, _) = parent_expr.kind && let hir::ExprKind::Index(_, index_expr, _) = parent_expr.kind
&& let Some(Constant::Int(index_value)) = constant(cx, cx.typeck_results(), index_expr) && let Some(Constant::Int(index_value)) = constant(cx, cx.typeck_results(), index_expr)
&& let Ok(index_value) = index_value.try_into() && let Ok(index_value) = index_value.try_into()
@ -256,7 +256,7 @@ impl<'a, 'tcx> Visitor<'tcx> for SliceIndexLintingVisitor<'a, 'tcx> {
// Make sure that this slice index is read only // Make sure that this slice index is read only
&& let maybe_addrof_id = map.parent_id(parent_id) && let maybe_addrof_id = map.parent_id(parent_id)
&& let Some(hir::Node::Expr(maybe_addrof_expr)) = map.find(maybe_addrof_id) && let Some(hir::Node::Expr(maybe_addrof_expr)) = cx.tcx.opt_hir_node(maybe_addrof_id)
&& let hir::ExprKind::AddrOf(_kind, hir::Mutability::Not, _inner_expr) = maybe_addrof_expr.kind && let hir::ExprKind::AddrOf(_kind, hir::Mutability::Not, _inner_expr) = maybe_addrof_expr.kind
{ {
use_info.index_use.push((index_value, map.span(parent_expr.hir_id))); use_info.index_use.push((index_value, map.span(parent_expr.hir_id)));

View File

@ -122,7 +122,7 @@ fn get_impl_span(cx: &LateContext<'_>, id: LocalDefId) -> Option<Span> {
kind: ItemKind::Impl(impl_item), kind: ItemKind::Impl(impl_item),
span, span,
.. ..
}) = cx.tcx.hir().get(id) }) = cx.tcx.hir_node(id)
{ {
(!span.from_expansion() (!span.from_expansion()
&& impl_item.generics.params.is_empty() && impl_item.generics.params.is_empty()

View File

@ -147,7 +147,7 @@ impl<'tcx> LateLintPass<'tcx> for LenZero {
&& let Some(output) = && let Some(output) =
parse_len_output(cx, cx.tcx.fn_sig(item.owner_id).instantiate_identity().skip_binder()) parse_len_output(cx, cx.tcx.fn_sig(item.owner_id).instantiate_identity().skip_binder())
{ {
let (name, kind) = match cx.tcx.hir().find(ty_hir_id) { let (name, kind) = match cx.tcx.opt_hir_node(ty_hir_id) {
Some(Node::ForeignItem(x)) => (x.ident.name, "extern type"), Some(Node::ForeignItem(x)) => (x.ident.name, "extern type"),
Some(Node::Item(x)) => match x.kind { Some(Node::Item(x)) => match x.kind {
ItemKind::Struct(..) => (x.ident.name, "struct"), ItemKind::Struct(..) => (x.ident.name, "struct"),

View File

@ -195,7 +195,7 @@ fn check_fn_inner<'tcx>(
.iter() .iter()
// In principle, the result of the call to `Node::ident` could be `unwrap`ped, as `DefId` should refer to a // In principle, the result of the call to `Node::ident` could be `unwrap`ped, as `DefId` should refer to a
// `Node::GenericParam`. // `Node::GenericParam`.
.filter_map(|&def_id| cx.tcx.hir().get_by_def_id(def_id).ident()) .filter_map(|&def_id| cx.tcx.hir_node_by_def_id(def_id).ident())
.map(|ident| ident.to_string()) .map(|ident| ident.to_string())
.collect::<Vec<_>>() .collect::<Vec<_>>()
.join(", "); .join(", ");

View File

@ -40,7 +40,7 @@ fn mut_warn_with_span(cx: &LateContext<'_>, span: Option<Span>) {
fn check_for_mutability(cx: &LateContext<'_>, bound: &Expr<'_>) -> Option<HirId> { fn check_for_mutability(cx: &LateContext<'_>, bound: &Expr<'_>) -> Option<HirId> {
if let Some(hir_id) = path_to_local(bound) if let Some(hir_id) = path_to_local(bound)
&& let Node::Pat(pat) = cx.tcx.hir().get(hir_id) && let Node::Pat(pat) = cx.tcx.hir_node(hir_id)
&& let PatKind::Binding(BindingAnnotation::MUT, ..) = pat.kind && let PatKind::Binding(BindingAnnotation::MUT, ..) = pat.kind
{ {
return Some(hir_id); return Some(hir_id);

View File

@ -58,12 +58,12 @@ pub(super) fn check<'tcx>(
match cx.qpath_res(qpath, pushed_item.hir_id) { match cx.qpath_res(qpath, pushed_item.hir_id) {
// immutable bindings that are initialized with literal or constant // immutable bindings that are initialized with literal or constant
Res::Local(hir_id) => { Res::Local(hir_id) => {
let node = cx.tcx.hir().get(hir_id); let node = cx.tcx.hir_node(hir_id);
if let Node::Pat(pat) = node if let Node::Pat(pat) = node
&& let PatKind::Binding(bind_ann, ..) = pat.kind && let PatKind::Binding(bind_ann, ..) = pat.kind
&& !matches!(bind_ann, BindingAnnotation(_, Mutability::Mut)) && !matches!(bind_ann, BindingAnnotation(_, Mutability::Mut))
&& let parent_node = cx.tcx.hir().parent_id(hir_id) && let parent_node = cx.tcx.hir().parent_id(hir_id)
&& let Some(Node::Local(parent_let_expr)) = cx.tcx.hir().find(parent_node) && let Some(Node::Local(parent_let_expr)) = cx.tcx.opt_hir_node(parent_node)
&& let Some(init) = parent_let_expr.init && let Some(init) = parent_let_expr.init
{ {
match init.kind { match init.kind {

View File

@ -58,7 +58,7 @@ impl<'tcx> LateLintPass<'tcx> for ManualAsyncFn {
&& block.stmts.is_empty() && block.stmts.is_empty()
&& let Some(closure_body) = desugared_async_block(cx, block) && let Some(closure_body) = desugared_async_block(cx, block)
&& let Node::Item(Item {vis_span, ..}) | Node::ImplItem(ImplItem {vis_span, ..}) = && let Node::Item(Item {vis_span, ..}) | Node::ImplItem(ImplItem {vis_span, ..}) =
cx.tcx.hir().get_by_def_id(def_id) cx.tcx.hir_node_by_def_id(def_id)
{ {
let header_span = span.with_hi(ret_ty.span.hi()); let header_span = span.with_hi(ret_ty.span.hi());

View File

@ -76,7 +76,7 @@ impl<'tcx> LateLintPass<'tcx> for ManualRemEuclid {
// Also ensures the const is nonzero since zero can't be a divisor // Also ensures the const is nonzero since zero can't be a divisor
&& const1 == const2 && const2 == const3 && const1 == const2 && const2 == const3
&& let Some(hir_id) = path_to_local(expr3) && let Some(hir_id) = path_to_local(expr3)
&& let Some(Node::Pat(_)) = cx.tcx.hir().find(hir_id) && let Some(Node::Pat(_)) = cx.tcx.opt_hir_node(hir_id)
{ {
// Apply only to params or locals with annotated types // Apply only to params or locals with annotated types
match cx.tcx.hir().find_parent(hir_id) { match cx.tcx.hir().find_parent(hir_id) {

View File

@ -44,7 +44,7 @@ pub(super) fn check<'tcx>(
// add note if not multi-line // add note if not multi-line
span_lint_and_then(cx, FILTER_NEXT, expr.span, msg, |diag| { span_lint_and_then(cx, FILTER_NEXT, expr.span, msg, |diag| {
let (applicability, pat) = if let Some(id) = path_to_local(recv) let (applicability, pat) = if let Some(id) = path_to_local(recv)
&& let Some(hir::Node::Pat(pat)) = cx.tcx.hir().find(id) && let Some(hir::Node::Pat(pat)) = cx.tcx.opt_hir_node(id)
&& let hir::PatKind::Binding(BindingAnnotation(_, Mutability::Not), _, ident, _) = pat.kind && let hir::PatKind::Binding(BindingAnnotation(_, Mutability::Not), _, ident, _) = pat.kind
{ {
(Applicability::Unspecified, Some((pat.span, ident))) (Applicability::Unspecified, Some((pat.span, ident)))

Some files were not shown because too many files have changed in this diff Show More