mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Auto merge of #118500 - ZetaNumbers:tcx_hir_refactor, r=petrochenkov
Move some methods from `tcx.hir()` to `tcx` https://github.com/rust-lang/rust/pull/118256#issuecomment-1826442834 Renamed: - 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
This commit is contained in:
commit
56d25ba5ea
@ -18,7 +18,7 @@ use rustc_middle::mir::{
|
||||
PlaceRef, ProjectionElem, Rvalue, Statement, StatementKind, Terminator, TerminatorKind,
|
||||
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_mir_dataflow::move_paths::{InitKind, MoveOutIndex, MovePathIndex};
|
||||
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 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 hir::ExprKind::MethodCall(_, _, args, _) = parent_expr.kind
|
||||
&& 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)
|
||||
};
|
||||
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(ident) = node.ident()
|
||||
&& 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 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());
|
||||
|
||||
struct ExprFinder<'hir> {
|
||||
@ -1509,7 +1512,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
let local_ty = self.body.local_decls[local].ty;
|
||||
|
||||
// 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;
|
||||
|
||||
@ -1558,7 +1561,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
// Check that the parent of the closure is a method call,
|
||||
// with receiver matching with local's type (modulo refs)
|
||||
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 {
|
||||
let recv_ty = typeck_results.expr_ty(recv);
|
||||
|
||||
@ -1635,15 +1638,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
issued_spans: &UseSpans<'tcx>,
|
||||
) {
|
||||
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,
|
||||
closure_change_spans: Vec<Span>,
|
||||
closure_arg_span: Option<Span>,
|
||||
in_closure: bool,
|
||||
suggest_arg: String,
|
||||
hir: rustc_middle::hir::map::Map<'hir>,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
closure_local_id: Option<hir::HirId>,
|
||||
closure_call_changes: Vec<(Span, String)>,
|
||||
}
|
||||
@ -1657,7 +1659,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
fn_decl: hir::FnDecl { inputs, .. },
|
||||
..
|
||||
}) = 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();
|
||||
if inputs.len() > 0 {
|
||||
@ -1722,8 +1724,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
if let Some(hir::Node::ImplItem(hir::ImplItem {
|
||||
kind: hir::ImplItemKind::Fn(_fn_sig, body_id),
|
||||
..
|
||||
})) = hir.find(self.mir_hir_id())
|
||||
&& let Some(hir::Node::Expr(expr)) = hir.find(body_id.hir_id)
|
||||
})) = self.infcx.tcx.opt_hir_node(self.mir_hir_id())
|
||||
&& let Some(hir::Node::Expr(expr)) = self.infcx.tcx.opt_hir_node(body_id.hir_id)
|
||||
{
|
||||
let mut finder = ExpressionFinder {
|
||||
capture_span: *capture_kind_span,
|
||||
@ -1733,7 +1735,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
suggest_arg: String::new(),
|
||||
closure_local_id: None,
|
||||
closure_call_changes: vec![],
|
||||
hir,
|
||||
tcx: self.infcx.tcx,
|
||||
};
|
||||
finder.visit_expr(expr);
|
||||
|
||||
@ -2294,7 +2296,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
let proper_span = proper_span.source_callsite();
|
||||
if let Some(scope) = self.body.source_scopes.get(source_info.scope)
|
||||
&& 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 hir::ExprKind::Block(block, _) = self.infcx.tcx.hir().body(id).value.kind
|
||||
{
|
||||
|
@ -87,7 +87,7 @@ impl<'tcx> BorrowExplanation<'tcx> {
|
||||
if let hir::ExprKind::Path(hir::QPath::Resolved(None, p)) = expr.kind
|
||||
&& let [hir::PathSegment { ident, args: None, .. }] = p.segments
|
||||
&& 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"));
|
||||
}
|
||||
|
@ -396,7 +396,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||
|
||||
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, _) =
|
||||
pat.kind
|
||||
{
|
||||
@ -661,7 +661,6 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||
if self.body.local_kind(local) != LocalKind::Arg {
|
||||
return (false, None);
|
||||
}
|
||||
let hir_map = self.infcx.tcx.hir();
|
||||
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 Some(td) =
|
||||
@ -671,7 +670,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||
};
|
||||
(
|
||||
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 {
|
||||
kind: hir::ItemKind::Trait(_, _, _, _, items),
|
||||
..
|
||||
@ -682,25 +681,27 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||
if !matches!(k, hir::AssocItemKind::Fn { .. }) {
|
||||
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;
|
||||
}
|
||||
f_in_trait_opt = Some(hi);
|
||||
break;
|
||||
}
|
||||
f_in_trait_opt.and_then(|f_in_trait| match hir_map.find(f_in_trait) {
|
||||
Some(Node::TraitItem(hir::TraitItem {
|
||||
kind:
|
||||
hir::TraitItemKind::Fn(
|
||||
hir::FnSig { decl: hir::FnDecl { inputs, .. }, .. },
|
||||
_,
|
||||
),
|
||||
..
|
||||
})) => {
|
||||
let hir::Ty { span, .. } = inputs[local.index() - 1];
|
||||
Some(span)
|
||||
f_in_trait_opt.and_then(|f_in_trait| {
|
||||
match self.infcx.tcx.opt_hir_node(f_in_trait) {
|
||||
Some(Node::TraitItem(hir::TraitItem {
|
||||
kind:
|
||||
hir::TraitItemKind::Fn(
|
||||
hir::FnSig { decl: hir::FnDecl { inputs, .. }, .. },
|
||||
_,
|
||||
),
|
||||
..
|
||||
})) => {
|
||||
let hir::Ty { span, .. } = inputs[local.index() - 1];
|
||||
Some(span)
|
||||
}
|
||||
_ => 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 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 };
|
||||
v.visit_body(body);
|
||||
v.hir_id
|
||||
@ -762,7 +762,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||
&& let Some(hir::Node::Local(hir::Local {
|
||||
pat: hir::Pat { kind: hir::PatKind::Ref(_, _), .. },
|
||||
..
|
||||
})) = hir_map.find(hir_id)
|
||||
})) = self.infcx.tcx.opt_hir_node(hir_id)
|
||||
&& let Ok(name) =
|
||||
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_span = self.infcx.tcx.def_span(self.mir_def_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 mut look_at_return = true;
|
||||
// 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() {
|
||||
// ...otherwise we are probably in the tail expression of the function, point at the
|
||||
// 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::TraitItem(hir::TraitItem {
|
||||
ident,
|
||||
@ -1199,12 +1199,11 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||
hir::intravisit::walk_stmt(self, s);
|
||||
}
|
||||
}
|
||||
let hir_map = self.infcx.tcx.hir();
|
||||
let def_id = self.body.source.def_id();
|
||||
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 };
|
||||
v.visit_body(body);
|
||||
v.hir_id
|
||||
@ -1213,7 +1212,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||
};
|
||||
|
||||
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());
|
||||
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 field = def.all_fields().nth(field.index())?
|
||||
// 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,
|
||||
// we can expect a field that is an immutable reference to a type.
|
||||
&& let hir::Node::Field(field) = node
|
||||
|
@ -672,7 +672,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
|
||||
|
||||
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 {
|
||||
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::Fn => {
|
||||
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
|
||||
.fn_decl()
|
||||
.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::Fn => {
|
||||
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
|
||||
.fn_decl()
|
||||
.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::Fn => {
|
||||
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
|
||||
.fn_decl()
|
||||
.expect("coroutine lowered from async gen fn should be in fn")
|
||||
@ -841,7 +841,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
|
||||
let type_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 {
|
||||
kind: hir::ExprKind::Closure(&hir::Closure { fn_decl_span, .. }),
|
||||
..
|
||||
|
@ -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
|
||||
/// has a `rustc_const_{un,}stable` attribute. Otherwise, return `Constness::NotConst`.
|
||||
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 {
|
||||
hir::Node::Ctor(_)
|
||||
|
@ -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
|
||||
// for a coroutine).
|
||||
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::PatKind::Binding(_, _, ident, _) = pat.kind {
|
||||
name = Some(ident.name);
|
||||
|
@ -119,8 +119,7 @@ impl<'tcx> NonConstOp<'tcx> for FnCallNonConst<'tcx> {
|
||||
match self_ty.kind() {
|
||||
Param(param_ty) => {
|
||||
debug!(?param_ty);
|
||||
let caller_hir_id = tcx.local_def_id_to_hir_id(caller);
|
||||
if let Some(generics) = tcx.hir().get(caller_hir_id).generics() {
|
||||
if let Some(generics) = tcx.hir_node_by_def_id(caller).generics() {
|
||||
let constraint = with_no_trimmed_paths!(format!(
|
||||
"~const {}",
|
||||
trait_ref.print_only_trait_path()
|
||||
|
@ -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
|
||||
{
|
||||
if !of_trait_ref.trait_def_id().is_some_and(|def_id| def_id.is_local()) {
|
||||
|
@ -2715,7 +2715,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
let hir = tcx.hir();
|
||||
|
||||
let hir::Node::ImplItem(hir::ImplItem { kind: hir::ImplItemKind::Fn(..), ident, .. }) =
|
||||
hir.get(fn_hir_id)
|
||||
tcx.hir_node(fn_hir_id)
|
||||
else {
|
||||
return None;
|
||||
};
|
||||
|
@ -504,7 +504,7 @@ fn check_item_type(tcx: TyCtxt<'_>, id: hir::ItemId) {
|
||||
let origin = tcx.opaque_type_origin(id.owner_id.def_id);
|
||||
if let hir::OpaqueTyOrigin::FnReturn(fn_def_id)
|
||||
| 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()
|
||||
{
|
||||
// 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) => {
|
||||
// In the case the discriminant is both a duplicate and overflowed, let the user know
|
||||
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 rustc_ast::LitKind::Int(lit_value, _int_kind) = &lit.node
|
||||
&& *lit_value != dis.val
|
||||
|
@ -2181,7 +2181,7 @@ pub(super) fn check_type_bounds<'tcx>(
|
||||
let impl_ty_span = if impl_ty.is_impl_trait_in_trait() {
|
||||
tcx.def_span(impl_ty_def_id)
|
||||
} 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 {
|
||||
kind: hir::TraitItemKind::Type(_, Some(ty)),
|
||||
..
|
||||
|
@ -278,7 +278,7 @@ fn report_mismatched_rpitit_signature<'tcx>(
|
||||
}
|
||||
|
||||
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::Return(ty) => (ty.span, ty.span, "", ""),
|
||||
};
|
||||
|
@ -43,7 +43,7 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: DefId) {
|
||||
return None;
|
||||
}
|
||||
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, _), .. })) => {
|
||||
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;
|
||||
}
|
||||
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(generics.where_clause_span)
|
||||
}
|
||||
@ -80,7 +80,7 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: DefId) {
|
||||
return None;
|
||||
}
|
||||
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(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();
|
||||
match start_t.kind() {
|
||||
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 {
|
||||
let mut error = false;
|
||||
if !generics.params.is_empty() {
|
||||
|
@ -130,7 +130,7 @@ fn get_owner_return_paths(
|
||||
) -> Option<(LocalDefId, ReturnsVisitor<'_>)> {
|
||||
let hir_id = tcx.local_def_id_to_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 mut visitor = ReturnsVisitor::default();
|
||||
visitor.visit_body(body);
|
||||
|
@ -793,7 +793,7 @@ fn could_be_self(trait_def_id: LocalDefId, ty: &hir::Ty<'_>) -> bool {
|
||||
/// When this is done, suggest using `Self` instead.
|
||||
fn check_object_unsafe_self_trait_by_name(tcx: TyCtxt<'_>, item: &hir::TraitItem<'_>) {
|
||||
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::ItemKind::Trait(..) => (item.ident, item.owner_id),
|
||||
_ => return,
|
||||
@ -1019,7 +1019,7 @@ fn check_type_defn<'tcx>(
|
||||
for field in &variant.fields {
|
||||
let field_id = field.did.expect_local();
|
||||
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(
|
||||
hir_ty.span,
|
||||
None,
|
||||
@ -1057,7 +1057,7 @@ fn check_type_defn<'tcx>(
|
||||
let last = idx == variant.fields.len() - 1;
|
||||
let field_id = field.did.expect_local();
|
||||
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(
|
||||
hir_ty.span,
|
||||
None,
|
||||
@ -1882,7 +1882,7 @@ impl<'tcx> WfCheckingCtxt<'_, 'tcx> {
|
||||
// Match the existing behavior.
|
||||
if pred.is_global() && !pred.has_type_flags(TypeFlags::HAS_BINDER_VARS) {
|
||||
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)
|
||||
|
||||
|
@ -221,7 +221,7 @@ pub(crate) fn placeholder_type_error_diag<'tcx>(
|
||||
|
||||
// Check if parent is const or static
|
||||
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!(
|
||||
parent_node,
|
||||
@ -354,7 +354,7 @@ impl<'tcx> ItemCtxt<'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<'_> {
|
||||
use rustc_hir::*;
|
||||
|
||||
let hir_id = tcx.local_def_id_to_hir_id(def_id);
|
||||
let Node::Item(item) = tcx.hir().get(hir_id) else {
|
||||
let Node::Item(item) = tcx.hir_node_by_def_id(def_id) else {
|
||||
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 output = match tcx.hir().get(hir_id) {
|
||||
let output = match tcx.hir_node(hir_id) {
|
||||
TraitItem(hir::TraitItem {
|
||||
kind: TraitItemKind::Fn(sig, TraitFn::Provided(_)),
|
||||
generics,
|
||||
@ -1551,7 +1550,7 @@ fn compute_sig_of_foreign_fn_decl<'tcx>(
|
||||
}
|
||||
|
||||
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 {
|
||||
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 {
|
||||
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), .. }) => {
|
||||
matches!(opaque.origin, hir::OpaqueTyOrigin::TyAlias { .. })
|
||||
}
|
||||
|
@ -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 node = tcx.hir().get(hir_id);
|
||||
let node = tcx.hir_node(hir_id);
|
||||
let parent_def_id = match node {
|
||||
Node::ImplItem(_)
|
||||
| Node::TraitItem(_)
|
||||
|
@ -83,7 +83,7 @@ pub(super) fn explicit_item_bounds(
|
||||
// RPITIT's bounds are the same as opaque type bounds, but with
|
||||
// a projection self type.
|
||||
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();
|
||||
return ty::EarlyBinder::bind(opaque_type_bounds(
|
||||
tcx,
|
||||
@ -102,8 +102,7 @@ pub(super) fn explicit_item_bounds(
|
||||
None => {}
|
||||
}
|
||||
|
||||
let hir_id = tcx.local_def_id_to_hir_id(def_id);
|
||||
let bounds = match tcx.hir().get(hir_id) {
|
||||
let bounds = match tcx.hir_node_by_def_id(def_id) {
|
||||
hir::Node::TraitItem(hir::TraitItem {
|
||||
kind: hir::TraitItemKind::Type(bounds, _),
|
||||
span,
|
||||
|
@ -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 node = tcx.hir().get(hir_id);
|
||||
let node = tcx.hir_node(hir_id);
|
||||
|
||||
let mut is_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.
|
||||
if let Node::Item(&Item { kind: ItemKind::OpaqueTy(..), .. }) = node {
|
||||
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 {
|
||||
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 node = tcx.hir().get(hir_id);
|
||||
let node = tcx.hir_node(hir_id);
|
||||
|
||||
let mut collector = ConstCollector { tcx, preds: FxIndexSet::default() };
|
||||
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 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);
|
||||
};
|
||||
|
||||
@ -713,7 +713,7 @@ pub(super) fn type_param_predicates(
|
||||
let mut extend = None;
|
||||
|
||||
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::ImplItem(item) => item.generics,
|
||||
|
@ -748,7 +748,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
|
||||
}
|
||||
if let hir::Node::Item(hir::Item {
|
||||
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(
|
||||
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 {
|
||||
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");
|
||||
};
|
||||
match param.source {
|
||||
@ -1305,7 +1305,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
|
||||
def = ResolvedArg::Error(guar);
|
||||
} else if let Some(body_id) = outermost_body {
|
||||
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::TraitItem(hir::TraitItem {
|
||||
owner_id,
|
||||
@ -2122,7 +2122,7 @@ pub fn deny_non_region_late_bound(
|
||||
let mut first = true;
|
||||
|
||||
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!();
|
||||
};
|
||||
|
||||
|
@ -20,10 +20,10 @@ fn anon_const_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx> {
|
||||
use rustc_middle::ty::Ty;
|
||||
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 = tcx.hir().get(parent_node_id);
|
||||
let parent_node = tcx.hir_node(parent_node_id);
|
||||
|
||||
let (generics, arg_idx) = match parent_node {
|
||||
// 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, .. })
|
||||
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 {
|
||||
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 output = match tcx.hir().get(hir_id) {
|
||||
let output = match tcx.hir_node(hir_id) {
|
||||
Node::TraitItem(item) => match item.kind {
|
||||
TraitItemKind::Fn(..) => {
|
||||
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() {
|
||||
use rustc_hir::*;
|
||||
|
||||
let hir_id = tcx.local_def_id_to_hir_id(def_id);
|
||||
Ok(ty::EarlyBinder::bind(match tcx.hir().get(hir_id) {
|
||||
Ok(ty::EarlyBinder::bind(match tcx.hir_node_by_def_id(def_id) {
|
||||
Node::Item(item) => match item.kind {
|
||||
ItemKind::OpaqueTy(OpaqueTy {
|
||||
origin: hir::OpaqueTyOrigin::TyAlias { .. },
|
||||
|
@ -50,8 +50,8 @@ pub(super) fn find_opaque_ty_constraints_for_tait(tcx: TyCtxt<'_>, def_id: Local
|
||||
if scope == hir::CRATE_HIR_ID {
|
||||
tcx.hir().walk_toplevel_module(&mut locator);
|
||||
} else {
|
||||
trace!("scope={:#?}", tcx.hir().get(scope));
|
||||
match tcx.hir().get(scope) {
|
||||
trace!("scope={:#?}", tcx.hir_node(scope));
|
||||
match tcx.hir_node(scope) {
|
||||
// We explicitly call `visit_*` methods, instead of using `intravisit::walk_*` methods
|
||||
// This allows our visitor to process the defining item itself, causing
|
||||
// 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 {
|
||||
span: tcx.def_span(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",
|
||||
Node::Item(hir::Item { kind: hir::ItemKind::Mod(_), .. }) => "module",
|
||||
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);
|
||||
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::ImplItem(it) => intravisit::walk_impl_item(&mut locator, it),
|
||||
Node::TraitItem(it) => intravisit::walk_trait_item(&mut locator, it),
|
||||
|
@ -122,7 +122,7 @@ fn diagnostic_hir_wf_check<'tcx>(
|
||||
// We will walk 'into' this type to try to find
|
||||
// a more precise span for our predicate.
|
||||
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::ImplItemKind::Type(ty) => vec![ty],
|
||||
hir::ImplItemKind::Const(ty, _) => vec![ty],
|
||||
|
@ -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 {
|
||||
hir::ItemKind::Struct(..) | hir::ItemKind::Enum(..) | hir::ItemKind::Union(..) => {
|
||||
let crate_map = tcx.inferred_outlives_crate(());
|
||||
|
@ -137,10 +137,9 @@ impl<'a, 'tcx> WrongNumberOfGenericArgs<'a, 'tcx> {
|
||||
// is from the 'of_trait' field of the enclosing impl
|
||||
|
||||
let parent = self.tcx.hir().get_parent(self.path_segment.hir_id);
|
||||
let parent_item = self
|
||||
.tcx
|
||||
.hir()
|
||||
.get_by_def_id(self.tcx.hir().get_parent_item(self.path_segment.hir_id).def_id);
|
||||
let parent_item = self.tcx.hir_node_by_def_id(
|
||||
self.tcx.hir().get_parent_item(self.path_segment.hir_id).def_id,
|
||||
);
|
||||
|
||||
// Get the HIR id of the trait ref
|
||||
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)
|
||||
&& 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
|
||||
{
|
||||
match &expr.kind {
|
||||
|
@ -238,8 +238,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
}
|
||||
|
||||
// Next, make sure that we have no type expectation.
|
||||
let Some(ret) = hir
|
||||
.find_by_def_id(self.body_id)
|
||||
let Some(ret) = self
|
||||
.tcx
|
||||
.opt_hir_node_by_def_id(self.body_id)
|
||||
.and_then(|owner| owner.fn_decl())
|
||||
.map(|decl| decl.output.span())
|
||||
else {
|
||||
@ -317,7 +318,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
hir_id: hir::HirId,
|
||||
sp: Span,
|
||||
) -> 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 {
|
||||
// check that the body's parent is an fn
|
||||
let parent = self.tcx.hir().get_parent(self.tcx.hir().parent_id(block.hir_id));
|
||||
|
@ -295,7 +295,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
) {
|
||||
let hir = self.tcx.hir();
|
||||
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 (
|
||||
hir::Node::Expr(hir::Expr {
|
||||
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 {
|
||||
kind: hir::ExprKind::Closure(&hir::Closure { fn_decl_span, .. }),
|
||||
..
|
||||
}) = hir.get(async_closure)
|
||||
}) = self.tcx.hir_node(async_closure)
|
||||
{
|
||||
fn_decl_span
|
||||
} else {
|
||||
@ -343,7 +343,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
callee_expr: &'tcx hir::Expr<'tcx>,
|
||||
) -> bool {
|
||||
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 (
|
||||
hir::Node::Expr(hir::Expr { kind: hir::ExprKind::Array(_), .. }),
|
||||
hir::ExprKind::Tup(exp),
|
||||
|
@ -483,8 +483,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
body: &hir::Body<'_>,
|
||||
expected_sig: ExpectedSig<'tcx>,
|
||||
) -> ClosureSignatures<'tcx> {
|
||||
let hir = self.tcx.hir();
|
||||
let expr_map_node = hir.get_by_def_id(expr_def_id);
|
||||
let expr_map_node = self.tcx.hir_node_by_def_id(expr_def_id);
|
||||
let expected_args: Vec<_> = expected_sig
|
||||
.sig
|
||||
.skip_binder()
|
||||
|
@ -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_ty_msg =
|
||||
"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(sig) = node.fn_sig()
|
||||
&& 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 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
|
||||
&& let hir::Node::Expr(hir::Expr {
|
||||
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_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, _, _))) =
|
||||
(expression, blk_id, fcx.get_node_fn_decl(parent_item))
|
||||
|
@ -289,7 +289,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
let hir::def::Res::Local(local_hir_id) = p.res else {
|
||||
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;
|
||||
};
|
||||
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::Block(hir::Block { expr: Some(&ref p), .. })
|
||||
| hir::Node::Expr(&ref p),
|
||||
) = self.tcx.hir().find(parent_id)
|
||||
) = self.tcx.opt_hir_node(parent_id)
|
||||
else {
|
||||
break;
|
||||
};
|
||||
@ -570,7 +570,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
let mut direct = false;
|
||||
loop {
|
||||
// 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)) => {
|
||||
parent_id = self.tcx.hir().parent_id(parent.hir_id);
|
||||
parent
|
||||
@ -672,7 +672,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
error: Option<TypeError<'tcx>>,
|
||||
) {
|
||||
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), .. })), _)
|
||||
if init.hir_id == expr.hir_id =>
|
||||
{
|
||||
@ -717,7 +717,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
None,
|
||||
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;
|
||||
secondary_span = pat.span;
|
||||
match self.tcx.hir().find_parent(pat.hir_id) {
|
||||
@ -790,7 +790,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
return;
|
||||
};
|
||||
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 {
|
||||
return;
|
||||
};
|
||||
@ -1014,8 +1014,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
hir::Path { res: hir::def::Res::Local(bind_hir_id), .. },
|
||||
)) = expr.kind
|
||||
{
|
||||
let bind = self.tcx.hir().find(*bind_hir_id);
|
||||
let parent = self.tcx.hir().find(self.tcx.hir().parent_id(*bind_hir_id));
|
||||
let bind = self.tcx.opt_hir_node(*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 {
|
||||
kind: hir::PatKind::Binding(_, _hir_id, _, _),
|
||||
..
|
||||
|
@ -883,7 +883,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
kind: hir::ImplItemKind::Fn(..),
|
||||
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
|
||||
// outside of function body" needs an explanation.
|
||||
@ -997,7 +997,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
then: impl FnOnce(&hir::Expr<'_>),
|
||||
) {
|
||||
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 {
|
||||
hir::Node::Expr(hir::Expr {
|
||||
kind:
|
||||
|
@ -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
|
||||
// `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| {
|
||||
let parent = self.tcx.hir().get(blk_id);
|
||||
let parent = self.tcx.hir_node(blk_id);
|
||||
self.get_node_fn_decl(parent)
|
||||
.map(|(fn_id, fn_decl, _, is_main)| (fn_id, fn_decl, is_main))
|
||||
})
|
||||
|
@ -94,7 +94,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
}
|
||||
|
||||
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) => {
|
||||
if self.closure_span_overlaps_error(error, expr.span) {
|
||||
return false;
|
||||
@ -454,7 +454,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
.find_ancestor_in_same_ctxt(error.obligation.cause.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.
|
||||
self.blame_specific_expr_if_possible(error, arg_expr)
|
||||
}
|
||||
|
@ -1734,7 +1734,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
}
|
||||
|
||||
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 {
|
||||
Node::Item(&hir::Item { kind: hir::ItemKind::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.
|
||||
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))
|
||||
}
|
||||
|
||||
@ -2084,7 +2084,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
let node = self
|
||||
.tcx
|
||||
.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 {
|
||||
Some(hir::Node::Item(item)) => call_finder.visit_item(item),
|
||||
Some(hir::Node::TraitItem(item)) => call_finder.visit_trait_item(item),
|
||||
|
@ -677,7 +677,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
// can suggest Box::pin.
|
||||
let parent = self.tcx.hir().parent_id(expr.hir_id);
|
||||
let Some(Node::Expr(Expr { kind: ExprKind::Call(fn_name, _), .. })) =
|
||||
self.tcx.hir().find(parent)
|
||||
self.tcx.opt_hir_node(parent)
|
||||
else {
|
||||
return false;
|
||||
};
|
||||
@ -824,7 +824,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
if let hir::TyKind::OpaqueDef(item_id, ..) = hir_ty.kind
|
||||
&& let hir::Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::OpaqueTy(op_ty), ..
|
||||
}) = self.tcx.hir().get(item_id.hir_id())
|
||||
}) = self.tcx.hir_node(item_id.hir_id())
|
||||
&& let [
|
||||
hir::GenericBound::LangItemTrait(hir::LangItem::Future, _, _, generic_args),
|
||||
] = 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 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 {
|
||||
kind:
|
||||
@ -1047,7 +1047,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
};
|
||||
let ty = self.normalize(expr.span, 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(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 {
|
||||
let node = self.tcx.hir().get(id);
|
||||
let node = self.tcx.hir_node(id);
|
||||
matches!(node, Node::Expr(Expr { kind: ExprKind::Loop(..), .. }))
|
||||
}
|
||||
|
||||
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(..), .. }))
|
||||
}
|
||||
|
||||
@ -1677,11 +1677,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
None,
|
||||
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 {
|
||||
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;
|
||||
};
|
||||
|
||||
@ -1697,7 +1697,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
..
|
||||
}) => {
|
||||
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 {
|
||||
return expr;
|
||||
};
|
||||
@ -1730,8 +1730,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
&& let hir::Path { segments: [_], res: crate::Res::Local(binding), .. } =
|
||||
call_expr_path
|
||||
&& let Some(hir::Node::Pat(hir::Pat { hir_id, .. })) =
|
||||
self.tcx.hir().find(*binding)
|
||||
&& let Some(closure) = self.tcx.hir().find(self.tcx.hir().parent_id(*hir_id))
|
||||
self.tcx.opt_hir_node(*binding)
|
||||
&& 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 Expr {
|
||||
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 {
|
||||
span: block_span, expr: Some(e), ..
|
||||
})) = self.tcx.hir().find(parent)
|
||||
})) = self.tcx.opt_hir_node(parent)
|
||||
{
|
||||
if e.hir_id == id {
|
||||
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 Some(Node::Param(hir::Param { hir_id: param_hir_id, .. })) =
|
||||
self.tcx.hir().find(local_parent)
|
||||
self.tcx.opt_hir_node(local_parent)
|
||||
else {
|
||||
return None;
|
||||
};
|
||||
@ -2221,13 +2221,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
hir_id: expr_hir_id,
|
||||
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 {
|
||||
return None;
|
||||
};
|
||||
|
||||
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 (
|
||||
Some(Node::Expr(hir::Expr {
|
||||
@ -2667,7 +2667,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
if let Some(Node::Expr(hir::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;
|
||||
}
|
||||
@ -3057,7 +3057,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
return;
|
||||
};
|
||||
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() }`
|
||||
return;
|
||||
}
|
||||
@ -3136,7 +3136,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
let hir::def::Res::Local(hir_id) = path.res else {
|
||||
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;
|
||||
};
|
||||
let Some(hir::Node::Local(hir::Local { ty: None, init: Some(init), .. })) =
|
||||
|
@ -127,7 +127,7 @@ fn has_typeck_results(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
|
||||
}
|
||||
|
||||
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 {
|
||||
false
|
||||
}
|
||||
@ -166,7 +166,7 @@ fn typeck_with_fallback<'tcx>(
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
// Figure out what primary body this item has.
|
||||
@ -201,7 +201,7 @@ fn typeck_with_fallback<'tcx>(
|
||||
span,
|
||||
}))
|
||||
} 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), .. })
|
||||
if anon_const.hir_id == id =>
|
||||
{
|
||||
|
@ -230,7 +230,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
}
|
||||
if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = kind
|
||||
&& 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(node) = self.tcx.hir().find_parent(p.hir_id)
|
||||
&& 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))) =
|
||||
(self_ty.kind(), parent_pred.kind().skip_binder())
|
||||
{
|
||||
let hir = self.tcx.hir();
|
||||
let node = match p.trait_ref.self_ty().kind() {
|
||||
ty::Param(_) => {
|
||||
// Account for `fn` items like in `issue-35677.rs` to
|
||||
// suggest restricting its type params.
|
||||
Some(hir.get_by_def_id(self.body_id))
|
||||
}
|
||||
ty::Adt(def, _) => {
|
||||
def.did().as_local().map(|def_id| hir.get_by_def_id(def_id))
|
||||
Some(self.tcx.hir_node_by_def_id(self.body_id))
|
||||
}
|
||||
ty::Adt(def, _) => def
|
||||
.did()
|
||||
.as_local()
|
||||
.map(|def_id| self.tcx.hir_node_by_def_id(def_id)),
|
||||
_ => None,
|
||||
};
|
||||
if let Some(hir::Node::Item(hir::Item { kind, .. })) = node
|
||||
@ -1952,7 +1952,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
visitor.visit_body(body);
|
||||
|
||||
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(self_ty) = self.node_ty_opt(expr.hir_id)
|
||||
{
|
||||
@ -2869,11 +2869,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
let id = item
|
||||
.def_id
|
||||
.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 {
|
||||
kind: hir::TraitItemKind::Fn(fn_sig, method),
|
||||
..
|
||||
})) = id.map(|id| self.tcx.hir().get(id))
|
||||
})) = id
|
||||
{
|
||||
let self_first_arg = match method {
|
||||
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.
|
||||
// We do this to avoid suggesting code that ends up as `T: FooBar`,
|
||||
// instead we suggest `T: Foo + Bar` in that case.
|
||||
match hir.get(id) {
|
||||
match self.tcx.hir_node(id) {
|
||||
Node::GenericParam(param) => {
|
||||
enum Introducer {
|
||||
Plus,
|
||||
@ -3183,7 +3183,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
}
|
||||
|
||||
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(
|
||||
hir::PathSegment { ident: method_name, .. },
|
||||
self_expr,
|
||||
|
@ -720,7 +720,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
&& let PatKind::Binding(_, _, binding, ..) = inner.kind
|
||||
{
|
||||
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);
|
||||
|
||||
let mutability = match mutbl {
|
||||
@ -941,7 +941,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
Some(hir::Node::Item(hir::Item {
|
||||
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) => {
|
||||
if hir::is_range_literal(expr) {
|
||||
let span = self.tcx.hir().span(body_id.hir_id);
|
||||
|
@ -69,12 +69,13 @@ pub fn resolve_rvalue_scopes<'a, 'tcx>(
|
||||
def_id: DefId,
|
||||
) -> RvalueScopes {
|
||||
let tcx = &fcx.tcx;
|
||||
let hir_map = tcx.hir();
|
||||
let mut rvalue_scopes = RvalueScopes::new();
|
||||
debug!("start resolving rvalue scopes, def_id={def_id:?}");
|
||||
debug!("rvalue_scope: rvalue_candidates={:?}", 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);
|
||||
}
|
||||
rvalue_scopes
|
||||
|
@ -850,7 +850,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
// Looks like a macro fragment. Try to find the real block.
|
||||
if let Some(hir::Node::Expr(&hir::Expr {
|
||||
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.
|
||||
// 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
|
||||
@ -1670,7 +1670,7 @@ fn apply_capture_kind_on_capture_ty<'tcx>(
|
||||
fn drop_location_span(tcx: TyCtxt<'_>, hir_id: hir::HirId) -> Span {
|
||||
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 {
|
||||
hir::Node::Item(item) => match item.kind {
|
||||
hir::ItemKind::Fn(_, _, owner_id) => tcx.hir().span(owner_id.hir_id),
|
||||
|
@ -232,7 +232,7 @@ impl<'tcx> DirtyCleanVisitor<'tcx> {
|
||||
/// Return all DepNode labels that should be asserted for this item.
|
||||
/// index=0 is the "name" used for error messages
|
||||
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 {
|
||||
HirNode::Item(item) => {
|
||||
match item.kind {
|
||||
|
@ -363,9 +363,7 @@ impl AddToDiagnostic for AddLifetimeParamsSuggestion<'_> {
|
||||
return false;
|
||||
};
|
||||
|
||||
let hir_id = self.tcx.local_def_id_to_hir_id(anon_reg.def_id);
|
||||
|
||||
let node = self.tcx.hir().get(hir_id);
|
||||
let node = self.tcx.hir_node_by_def_id(anon_reg.def_id);
|
||||
let is_impl = matches!(&node, hir::Node::ImplItem(_));
|
||||
let generics = match node {
|
||||
hir::Node::Item(&hir::Item {
|
||||
|
@ -891,7 +891,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
}
|
||||
// don't suggest wrapping either blocks in `if .. {} else {}`
|
||||
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;
|
||||
};
|
||||
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");
|
||||
self.suggest_for_all_lifetime_closure(
|
||||
span,
|
||||
self.tcx.hir().get_by_def_id(def_id),
|
||||
self.tcx.hir_node_by_def_id(def_id),
|
||||
&exp_found,
|
||||
diag,
|
||||
);
|
||||
@ -2121,7 +2121,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
let TypeError::FixedArraySize(sz) = terr else {
|
||||
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), .. })) => {
|
||||
let body = hir.body(*body_id);
|
||||
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
|
||||
/// or statement, peeling off any inner blocks.
|
||||
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),
|
||||
// The parser was in a weird state if either of these happen, but
|
||||
// it's better not to panic.
|
||||
|
@ -26,8 +26,7 @@ pub fn find_anon_type<'tcx>(
|
||||
br: &ty::BoundRegionKind,
|
||||
) -> Option<(&'tcx hir::Ty<'tcx>, &'tcx hir::FnSig<'tcx>)> {
|
||||
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().get(hir_id).fn_sig()?;
|
||||
let fn_sig = tcx.hir_node_by_def_id(anon_reg.def_id).fn_sig()?;
|
||||
|
||||
fn_sig
|
||||
.decl
|
||||
|
@ -460,7 +460,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
|
||||
tcx.hir().trait_impls(trait_did).iter().find_map(|&impl_did| {
|
||||
if let Node::Item(Item {
|
||||
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| {
|
||||
// FIXME: we should check `self_ty` against the receiver
|
||||
// type in the `UnifyReceiver` context, but for now, use
|
||||
|
@ -50,11 +50,10 @@ pub fn find_param_with_region<'tcx>(
|
||||
|
||||
let hir = &tcx.hir();
|
||||
let def_id = id.as_local()?;
|
||||
let hir_id = tcx.local_def_id_to_hir_id(def_id);
|
||||
|
||||
// FIXME: use def_kind
|
||||
// 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 { .. }, .. }) => {
|
||||
return None;
|
||||
}
|
||||
|
@ -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
|
||||
// `expected` and point at it.
|
||||
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);
|
||||
|
||||
|
@ -42,7 +42,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
]
|
||||
.into_iter()
|
||||
.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)
|
||||
});
|
||||
match remove_semicolon {
|
||||
@ -62,7 +62,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
let mut ret = None;
|
||||
for (id, ty) in [(first_id, second_ty), (second_id, first_ty)] {
|
||||
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)
|
||||
{
|
||||
ret = Some(diag);
|
||||
|
@ -683,8 +683,8 @@ fn may_define_opaque_type(tcx: TyCtxt<'_>, def_id: LocalDefId, opaque_hir_id: hi
|
||||
let res = hir_id == scope;
|
||||
trace!(
|
||||
"may_define_opaque_type(def={:?}, opaque_node={:?}) = {}",
|
||||
tcx.hir().find(hir_id),
|
||||
tcx.hir().get(opaque_hir_id),
|
||||
tcx.opt_hir_node(hir_id),
|
||||
tcx.hir_node(opaque_hir_id),
|
||||
res
|
||||
);
|
||||
res
|
||||
|
@ -34,7 +34,7 @@ declare_lint_pass!(DefaultHashTypes => [DEFAULT_HASH_TYPES]);
|
||||
impl LateLintPass<'_> for DefaultHashTypes {
|
||||
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 };
|
||||
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
|
||||
return;
|
||||
}
|
||||
|
@ -202,7 +202,7 @@ fn lint_overflowing_range_endpoint<'tcx>(
|
||||
) -> bool {
|
||||
// Look past casts to support cases like `0..256 as u8`
|
||||
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
|
||||
{
|
||||
(par_expr, expr.span)
|
||||
@ -213,7 +213,7 @@ fn lint_overflowing_range_endpoint<'tcx>(
|
||||
// We only want to handle exclusive (`..`) ranges,
|
||||
// which are represented as `ExprKind::Struct`.
|
||||
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 };
|
||||
if !is_range_literal(struct_expr) {
|
||||
return false;
|
||||
@ -498,7 +498,7 @@ fn lint_uint_literal<'tcx>(
|
||||
};
|
||||
if lit_val < min || lit_val > max {
|
||||
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 {
|
||||
hir::ExprKind::Cast(..) => {
|
||||
if let ty::Char = cx.typeck_results().expr_ty(par_e).kind() {
|
||||
|
@ -1144,7 +1144,7 @@ fn should_encode_type(tcx: TyCtxt<'_>, def_id: LocalDefId, def_kind: DefKind) ->
|
||||
let origin = tcx.opaque_type_origin(def_id);
|
||||
if let hir::OpaqueTyOrigin::FnReturn(fn_def_id)
|
||||
| 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()
|
||||
{
|
||||
false
|
||||
@ -1161,7 +1161,7 @@ fn should_encode_type(tcx: TyCtxt<'_>, def_id: LocalDefId, def_kind: DefKind) ->
|
||||
}
|
||||
}
|
||||
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!() };
|
||||
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
|
||||
// can cause any observable issues or not.
|
||||
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 {
|
||||
let g = tcx.generics_of(def_id);
|
||||
record!(self.tables.generics_of[def_id] <- g);
|
||||
|
@ -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)]
|
||||
pub struct Map<'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> {
|
||||
#[inline]
|
||||
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> {
|
||||
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>> {
|
||||
self.find(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))
|
||||
self.tcx.opt_hir_node(self.opt_parent_id(hir_id)?)
|
||||
}
|
||||
|
||||
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>> {
|
||||
@ -264,7 +271,7 @@ impl<'hir> Map<'hir> {
|
||||
|
||||
#[track_caller]
|
||||
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()
|
||||
} else {
|
||||
bug!("no node for hir_id `{}`", hir_id)
|
||||
@ -273,7 +280,7 @@ impl<'hir> Map<'hir> {
|
||||
|
||||
#[track_caller]
|
||||
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()
|
||||
} else {
|
||||
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`.
|
||||
pub fn body_owner(self, BodyId { hir_id }: BodyId) -> HirId {
|
||||
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
|
||||
}
|
||||
|
||||
pub fn body_owner_def_id(self, BodyId { hir_id }: BodyId) -> LocalDefId {
|
||||
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,
|
||||
/// if the node is a body owner, otherwise returns `None`.
|
||||
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)?;
|
||||
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`.
|
||||
#[inline]
|
||||
pub fn parent_iter(self, current_id: HirId) -> impl Iterator<Item = (HirId, Node<'hir>)> {
|
||||
self.parent_id_iter(current_id).filter_map(move |id| Some((id, self.find(id)?)))
|
||||
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`
|
||||
@ -600,7 +610,7 @@ impl<'hir> Map<'hir> {
|
||||
pub fn get_return_block(self, id: HirId) -> Option<HirId> {
|
||||
let mut iter = self.parent_iter(id).peekable();
|
||||
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
|
||||
// expressions.
|
||||
ignore_tail = true;
|
||||
@ -708,7 +718,7 @@ impl<'hir> Map<'hir> {
|
||||
let mut scope = id;
|
||||
loop {
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -764,7 +774,7 @@ impl<'hir> Map<'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,
|
||||
_ => 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> {
|
||||
match self.find(id) {
|
||||
match self.tcx.opt_hir_node(id) {
|
||||
Some(Node::Expr(expr)) => expr,
|
||||
_ => bug!("expected expr, found {}", self.node_to_string(id)),
|
||||
}
|
||||
@ -791,7 +801,7 @@ impl<'hir> Map<'hir> {
|
||||
|
||||
#[inline]
|
||||
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),
|
||||
// A `Ctor` doesn't have an identifier itself, but its parent
|
||||
// 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.
|
||||
Node::Item(Item { kind: ItemKind::Fn(sig, ..), span: outer_span, .. })
|
||||
| Node::TraitItem(TraitItem {
|
||||
@ -950,7 +960,7 @@ impl<'hir> Map<'hir> {
|
||||
/// Like `hir.span()`, but includes the body of items
|
||||
/// (instead of just the item header)
|
||||
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::Item(item) => 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> {
|
||||
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> {
|
||||
@ -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 node_str = |prefix| format!("{id} ({prefix} `{}`)", span_str());
|
||||
|
||||
match map.find(id) {
|
||||
match map.tcx.opt_hir_node(id) {
|
||||
Some(Node::Item(item)) => {
|
||||
let item_str = match item.kind {
|
||||
ItemKind::ExternCrate(..) => "extern crate",
|
||||
|
@ -195,7 +195,7 @@ pub fn provide(providers: &mut Providers) {
|
||||
| Node::ForeignItem(&ForeignItem {
|
||||
kind: ForeignItemKind::Fn(_, idents, _),
|
||||
..
|
||||
}) = hir.get(hir_id)
|
||||
}) = tcx.hir_node(hir_id)
|
||||
{
|
||||
idents
|
||||
} else {
|
||||
|
@ -180,7 +180,7 @@ impl Scope {
|
||||
};
|
||||
let span = tcx.hir().span(hir_id);
|
||||
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
|
||||
// indexed statement and ending at end of
|
||||
// `blk`; reuse span of `blk` and shift `lo`
|
||||
|
@ -219,7 +219,7 @@ fn late_report_deprecation(
|
||||
}
|
||||
let method_span = method_span.unwrap_or(span);
|
||||
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);
|
||||
deprecation_suggestion(diag, kind, suggestion, method_span);
|
||||
}
|
||||
|
@ -167,7 +167,7 @@ impl<'tcx> Const<'tcx> {
|
||||
/// becomes `Unevaluated`.
|
||||
#[instrument(skip(tcx), level = "debug")]
|
||||
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,
|
||||
_ => span_bug!(
|
||||
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<'_>> {
|
||||
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 {
|
||||
kind: hir::GenericParamKind::Const { default: Some(ac), .. },
|
||||
..
|
||||
|
@ -1174,7 +1174,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
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::ImplItem(..)) => {
|
||||
self.is_bound_region_in_impl_item(suitable_region_binding_scope)
|
||||
@ -1217,8 +1217,8 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
None,
|
||||
hir::Path { res: hir::def::Res::Def(DefKind::TyAlias, def_id), .. }, )) = hir_output.kind
|
||||
&& 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_generics) = self.hir().get_by_def_id(local_id).generics()
|
||||
&& let Some(alias_ty) = self.hir_node_by_def_id(local_id).alias_ty() // it is type alias
|
||||
&& let Some(alias_generics) = self.hir_node_by_def_id(local_id).generics()
|
||||
{
|
||||
v.visit_ty(alias_ty);
|
||||
if !v.0.is_empty() {
|
||||
@ -2137,7 +2137,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
loop {
|
||||
let parent = self.local_parent(rpit_lifetime_param_def_id);
|
||||
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
|
||||
.iter()
|
||||
@ -2221,8 +2221,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
/// 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 {
|
||||
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().get(hir_id);
|
||||
let node = self.hir_node_by_def_id(local_def_id);
|
||||
|
||||
matches!(
|
||||
node,
|
||||
|
@ -154,8 +154,9 @@ pub fn recursive_type_error(
|
||||
let (_, field_id) = item_and_field_ids[i];
|
||||
let (next_item_id, _) = item_and_field_ids[(i + 1) % cycle_len];
|
||||
// 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().get(hir_id) else { bug!("expected field") };
|
||||
let hir::Node::Field(field) = tcx.hir_node_by_def_id(field_id) else {
|
||||
bug!("expected field")
|
||||
};
|
||||
let mut found = Vec::new();
|
||||
find_item_ty_spans(tcx, field.ty, next_item_id, &mut found, representable_ids);
|
||||
|
||||
|
@ -572,7 +572,7 @@ fn construct_const<'a, 'tcx>(
|
||||
let hir_id = tcx.local_def_id_to_hir_id(def);
|
||||
|
||||
// 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 {
|
||||
kind: hir::ItemKind::Static(ty, _, _) | hir::ItemKind::Const(ty, _, _),
|
||||
span,
|
||||
|
@ -110,7 +110,7 @@ impl<'tcx> Cx<'tcx> {
|
||||
|
||||
#[instrument(level = "debug", skip(self))]
|
||||
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 => bug!("pattern became {:?}", node),
|
||||
};
|
||||
|
@ -50,7 +50,7 @@ impl<'tcx> MirPass<'tcx> for InstrumentCoverage {
|
||||
}
|
||||
|
||||
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
|
||||
// at compile time by Miri).
|
||||
|
@ -604,7 +604,7 @@ impl CheckAttrVisitor<'_> {
|
||||
&& !self.tcx.sess.target.is_like_wasm
|
||||
&& !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!();
|
||||
};
|
||||
let hir::ItemKind::Fn(sig, _, _) = item.kind else {
|
||||
@ -820,7 +820,7 @@ impl CheckAttrVisitor<'_> {
|
||||
self.doc_attr_str_error(meta, "keyword");
|
||||
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),
|
||||
_ => None,
|
||||
}) {
|
||||
@ -846,7 +846,7 @@ impl CheckAttrVisitor<'_> {
|
||||
}
|
||||
|
||||
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),
|
||||
_ => None,
|
||||
}) {
|
||||
@ -1387,7 +1387,7 @@ impl CheckAttrVisitor<'_> {
|
||||
/// 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) {
|
||||
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
|
||||
&& !matches!(abi, Abi::Rust | Abi::RustIntrinsic | Abi::PlatformIntrinsic)
|
||||
{
|
||||
@ -1456,7 +1456,7 @@ impl CheckAttrVisitor<'_> {
|
||||
}
|
||||
|
||||
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.
|
||||
@ -2074,7 +2074,7 @@ impl CheckAttrVisitor<'_> {
|
||||
&& let hir::Node::Item(Item {
|
||||
kind: ItemKind::ForeignMod { abi: Abi::RustIntrinsic | Abi::PlatformIntrinsic, .. },
|
||||
..
|
||||
}) = hir.get(parent)
|
||||
}) = self.tcx.hir_node(parent)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -2222,7 +2222,7 @@ impl CheckAttrVisitor<'_> {
|
||||
} else {
|
||||
// special case when `#[macro_export]` is applied to a macro 2.0
|
||||
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;
|
||||
|
||||
if is_decl_macro {
|
||||
|
@ -32,7 +32,7 @@ use crate::errors::{
|
||||
// may need to be marked as live.
|
||||
fn should_explore(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
|
||||
matches!(
|
||||
tcx.hir().find_by_def_id(def_id),
|
||||
tcx.opt_hir_node_by_def_id(def_id),
|
||||
Some(
|
||||
Node::Item(..)
|
||||
| Node::ImplItem(..)
|
||||
@ -297,7 +297,7 @@ impl<'tcx> MarkSymbolVisitor<'tcx> {
|
||||
// tuple struct constructor function
|
||||
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
|
||||
// by declaring fn calls, statics, ... within said items as live, as well as
|
||||
// the item itself, although technically this is not the case.
|
||||
|
@ -126,7 +126,7 @@ fn configure_main(tcx: TyCtxt<'_>, visitor: &EntryContext<'_>) -> Option<(DefId,
|
||||
{
|
||||
// non-local main imports are handled below
|
||||
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) });
|
||||
return None;
|
||||
|
@ -155,7 +155,7 @@ impl<'tcx> LanguageItemCollector<'tcx> {
|
||||
// have minimum requirements.
|
||||
|
||||
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() {
|
||||
Some(generics) => (
|
||||
|
@ -4,7 +4,6 @@ use rustc_hir as hir;
|
||||
use rustc_hir::def_id::{LocalDefId, LocalModDefId};
|
||||
use rustc_hir::intravisit::{self, Visitor};
|
||||
use rustc_hir::{Destination, Movability, Node};
|
||||
use rustc_middle::hir::map::Map;
|
||||
use rustc_middle::hir::nested_filter;
|
||||
use rustc_middle::query::Providers;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
@ -30,16 +29,16 @@ enum Context {
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
struct CheckLoopVisitor<'a, 'hir> {
|
||||
struct CheckLoopVisitor<'a, 'tcx> {
|
||||
sess: &'a Session,
|
||||
hir_map: Map<'hir>,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
cx: Context,
|
||||
}
|
||||
|
||||
fn check_mod_loops(tcx: TyCtxt<'_>, module_def_id: LocalModDefId) {
|
||||
tcx.hir().visit_item_likes_in_module(
|
||||
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;
|
||||
|
||||
fn nested_visit_map(&mut self) -> Self::Map {
|
||||
self.hir_map
|
||||
self.tcx.hir()
|
||||
}
|
||||
|
||||
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,
|
||||
};
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if let Some(break_expr) = opt_expr {
|
||||
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) => {
|
||||
(Some(sp), label, Some(source))
|
||||
}
|
||||
@ -188,7 +187,7 @@ impl<'a, 'hir> Visitor<'hir> for CheckLoopVisitor<'a, 'hir> {
|
||||
|
||||
match destination.target_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 {
|
||||
span: e.span,
|
||||
block_span: block.span,
|
||||
|
@ -35,7 +35,7 @@ fn check_mod_naked_functions(tcx: TyCtxt<'_>, module_def_id: LocalModDefId) {
|
||||
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::TraitItem(hir::TraitItem {
|
||||
kind: hir::TraitItemKind::Fn(sig, hir::TraitFn::Provided(body_id)),
|
||||
|
@ -115,7 +115,7 @@ impl<'tcx> ReachableContext<'tcx> {
|
||||
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 {
|
||||
hir::ItemKind::Fn(..) => item_might_be_inlined(self.tcx, def_id.into()),
|
||||
_ => false,
|
||||
@ -146,7 +146,7 @@ impl<'tcx> ReachableContext<'tcx> {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -1783,7 +1783,7 @@ fn local_visibility(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Visibility {
|
||||
Some(vis) => *vis,
|
||||
None => {
|
||||
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.
|
||||
// They have visibilities inherited from the module they are defined in.
|
||||
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
|
||||
// and are not filled in resolve.
|
||||
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 {
|
||||
kind: hir::ItemKind::Impl(hir::Impl { of_trait: Some(tr), .. }),
|
||||
..
|
||||
|
@ -103,7 +103,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
/// to be the enclosing (async) block/function/closure
|
||||
fn describe_enclosure(&self, hir_id: hir::HirId) -> Option<&'static str> {
|
||||
let hir = self.tcx.hir();
|
||||
let node = hir.find(hir_id)?;
|
||||
let node = self.tcx.opt_hir_node(hir_id)?;
|
||||
match &node {
|
||||
hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(sig, _, body_id), .. }) => {
|
||||
self.describe_coroutine(*body_id).or_else(|| {
|
||||
|
@ -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
|
||||
// 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 {
|
||||
hir::Node::Item(hir::Item {
|
||||
ident,
|
||||
@ -732,7 +732,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
let Some(typeck_results) = &self.typeck_results else {
|
||||
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;
|
||||
};
|
||||
let Some(arg_ty) = typeck_results.expr_ty_adjusted_opt(expr) else {
|
||||
@ -785,7 +785,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
kind:
|
||||
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);
|
||||
err.span_suggestion_verbose(
|
||||
@ -821,7 +821,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
if self.predicate_may_hold(&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 is_receiver = matches!(
|
||||
call_node,
|
||||
@ -1046,7 +1046,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
let Res::Local(hir_id) = path.res else {
|
||||
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;
|
||||
};
|
||||
let Some(hir::Node::Local(hir::Local { ty: None, init: Some(init), .. })) =
|
||||
@ -1106,7 +1106,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
else {
|
||||
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 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
|
||||
&& 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 None = local.ty
|
||||
&& 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) {
|
||||
let hir = self.tcx.hir();
|
||||
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 `()`
|
||||
// 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>,
|
||||
) -> bool {
|
||||
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
|
||||
&& let hir::ExprKind::Block(blk, _) = &hir.body(*body_id).value.kind
|
||||
&& 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> {
|
||||
let hir = self.tcx.hir();
|
||||
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 {
|
||||
return None;
|
||||
};
|
||||
@ -1923,7 +1922,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
}
|
||||
|
||||
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), .. })) =
|
||||
node
|
||||
{
|
||||
@ -2041,7 +2040,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
let ty::FnPtr(found) = found.kind() else {
|
||||
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;
|
||||
};
|
||||
let hir::ExprKind::Path(path) = arg.kind else {
|
||||
@ -2986,7 +2985,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
}
|
||||
ObligationCauseCode::VariableType(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), .. })) => {
|
||||
err.span_suggestion_verbose(
|
||||
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",
|
||||
);
|
||||
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 {
|
||||
bug!("expected closure in SizedClosureCapture obligation");
|
||||
};
|
||||
@ -3701,8 +3700,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
call_hir_id: HirId,
|
||||
) {
|
||||
let tcx = self.tcx;
|
||||
let hir = tcx.hir();
|
||||
if let Some(Node::Expr(expr)) = hir.find(arg_hir_id)
|
||||
if let Some(Node::Expr(expr)) = tcx.opt_hir_node(arg_hir_id)
|
||||
&& let Some(typeck_results) = &self.typeck_results
|
||||
{
|
||||
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 {
|
||||
body, fn_decl_span, ..
|
||||
}) = value.kind
|
||||
&& let body = hir.body(*body)
|
||||
&& let body = tcx.hir().body(*body)
|
||||
&& !matches!(body.value.kind, hir::ExprKind::Block(..))
|
||||
{
|
||||
// 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
|
||||
&& 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 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
|
||||
{
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
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 {
|
||||
kind: hir::ExprKind::MethodCall(path, rcvr, ..), ..
|
||||
})) = 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, .. }, _)
|
||||
| hir::ExprKind::MethodCall(
|
||||
hir::PathSegment { ident: Ident { span, .. }, .. },
|
||||
@ -4002,7 +4000,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
continue;
|
||||
};
|
||||
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 {
|
||||
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
|
||||
&& 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)
|
||||
{
|
||||
// We've reached the root of the method call chain...
|
||||
@ -4457,7 +4455,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
}
|
||||
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;
|
||||
};
|
||||
|
||||
@ -4778,7 +4776,7 @@ pub fn suggest_desugaring_async_fn_to_impl_future_in_trait<'tcx>(
|
||||
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 {
|
||||
// `async fn` should always lower to a lang item bound... but don't ICE.
|
||||
return None;
|
||||
|
@ -984,13 +984,13 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
fn fn_arg_obligation(&self, obligation: &PredicateObligation<'tcx>) -> bool {
|
||||
if let ObligationCauseCode::FunctionArgumentObligation { arg_hir_id, .. } =
|
||||
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 hir::ExprKind::Path(hir::QPath::Resolved(
|
||||
None,
|
||||
hir::Path { res: hir::def::Res::Local(hir_id), .. },
|
||||
)) = 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)
|
||||
&& 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 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), .. })) => {
|
||||
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
|
||||
&& 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)
|
||||
{
|
||||
// We've reached the root of the method call chain...
|
||||
@ -2499,7 +2499,7 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
ident: trait_name,
|
||||
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
|
||||
.iter()
|
||||
.find(|item_ref| item_ref.ident == *assoc_item_name)
|
||||
|
@ -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 decl = tcx
|
||||
.hir()
|
||||
.find_by_def_id(impl_fn_def_id)
|
||||
.opt_hir_node_by_def_id(impl_fn_def_id)
|
||||
.expect("expected item")
|
||||
.fn_decl()
|
||||
.expect("expected decl");
|
||||
|
@ -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> + '_ {
|
||||
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() {
|
||||
decl.inputs.iter().map(|ty| ty.span).chain(iter::once(decl.output.span()))
|
||||
} else {
|
||||
|
@ -28,7 +28,7 @@ pub(crate) fn walk_types<'tcx, V: SpannedTypeVisitor<'tcx>>(
|
||||
// Walk over the signature of the function
|
||||
DefKind::AssocFn | DefKind::Fn => {
|
||||
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.
|
||||
visitor.visit(hir_sig.output.span(), ty_sig.output());
|
||||
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 |
|
||||
// Walk over the type of the item
|
||||
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,
|
||||
_ => tcx.def_span(item),
|
||||
};
|
||||
@ -70,11 +70,11 @@ pub(crate) fn walk_types<'tcx, V: SpannedTypeVisitor<'tcx>>(
|
||||
DefKind::InlineConst | DefKind::Closure => {}
|
||||
DefKind::Impl { 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..];
|
||||
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,
|
||||
_ => tcx.def_span(item),
|
||||
};
|
||||
|
@ -74,7 +74,7 @@ fn sized_constraint_for_ty<'tcx>(
|
||||
}
|
||||
|
||||
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::ImplItem(hir::ImplItem { 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.
|
||||
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 {
|
||||
hir::IsAsync::Async(_) => ty::Asyncness::Yes,
|
||||
hir::IsAsync::NotAsync => ty::Asyncness::No,
|
||||
|
@ -1596,7 +1596,6 @@ fn first_non_private<'tcx>(
|
||||
// Absolute paths are not. We start from the parent of the item.
|
||||
[.., 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.
|
||||
for child in
|
||||
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() {
|
||||
if let Some(use_def_id) = reexp.id()
|
||||
&& 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()
|
||||
&& let hir::ItemKind::Use(path, _) = item.kind
|
||||
{
|
||||
|
@ -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 {
|
||||
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 {
|
||||
return true;
|
||||
}
|
||||
@ -641,7 +641,6 @@ pub(crate) fn inherits_doc_hidden(
|
||||
mut def_id: LocalDefId,
|
||||
stop_at: Option<LocalDefId>,
|
||||
) -> bool {
|
||||
let hir = tcx.hir();
|
||||
while let Some(id) = tcx.opt_local_parent(def_id) {
|
||||
if let Some(stop_at) = stop_at
|
||||
&& id == stop_at
|
||||
@ -651,7 +650,7 @@ pub(crate) fn inherits_doc_hidden(
|
||||
def_id = id;
|
||||
if tcx.is_doc_hidden(def_id.to_def_id()) {
|
||||
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(_), .. }),)
|
||||
{
|
||||
// `impl` blocks stand a bit on their own: unless they have `#[doc(hidden)]` directly
|
||||
|
@ -94,7 +94,7 @@ impl<'tcx> SpanMapVisitor<'tcx> {
|
||||
|
||||
/// 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) {
|
||||
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) {
|
||||
let cspan = clean::Span::new(span);
|
||||
// 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) {
|
||||
// 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;".
|
||||
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(
|
||||
item.ident.span,
|
||||
LinkFromSrc::Local(clean::Span::new(m.spans.inner_span)),
|
||||
|
@ -80,7 +80,7 @@ pub(crate) fn should_have_doc_example(cx: &DocContext<'_>, item: &clean::Item) -
|
||||
|
||||
// check if parent is trait impl
|
||||
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!(
|
||||
parent_node,
|
||||
hir::Node::Item(hir::Item {
|
||||
|
@ -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 item = tcx.hir().get_by_def_id(res_did);
|
||||
let item = tcx.hir_node_by_def_id(res_did);
|
||||
|
||||
if !please_inline {
|
||||
let inherits_hidden = !document_hidden && inherits_doc_hidden(tcx, res_did, None);
|
||||
|
@ -62,7 +62,7 @@ impl LateLintPass<'_> for AbsolutePaths {
|
||||
} = self;
|
||||
|
||||
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(_, _)))
|
||||
&& let [first, rest @ ..] = path.segments
|
||||
// Handle `::std`
|
||||
|
@ -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 {
|
||||
let map = cx.tcx.hir();
|
||||
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 {
|
||||
Node::Block(block) => {
|
||||
|
@ -1090,7 +1090,7 @@ fn report<'tcx>(
|
||||
if parent_id == data.first_expr.hir_id {
|
||||
return;
|
||||
}
|
||||
(cx.tcx.hir().get(parent_id).expect_expr().span, true)
|
||||
(cx.tcx.hir_node(parent_id).expect_expr().span, true)
|
||||
} else {
|
||||
(expr.span, false)
|
||||
};
|
||||
|
@ -195,7 +195,7 @@ impl<'tcx> LateLintPass<'tcx> for DerivableImpls {
|
||||
&& let Some(def_id) = trait_ref.trait_def_id()
|
||||
&& cx.tcx.is_diagnostic_item(sym::Default, def_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 Body { value: func_expr, .. } = cx.tcx.hir().body(*b)
|
||||
&& let &Adt(adt_def, args) = cx.tcx.type_of(item.owner_id).instantiate_identity().kind()
|
||||
|
@ -42,7 +42,7 @@ impl LateLintPass<'_> for EmptyDrop {
|
||||
}) = item.kind
|
||||
&& trait_ref.trait_def_id() == cx.tcx.lang_items().drop_trait()
|
||||
&& 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 Body { value: func_expr, .. } = cx.tcx.hir().body(*b)
|
||||
&& let func_expr = peel_blocks(func_expr)
|
||||
|
@ -5,7 +5,7 @@ use rustc_infer::infer::TyCtxtInferExt;
|
||||
use rustc_lint::{LateContext, LateLintPass};
|
||||
use rustc_middle::mir::FakeReadCause;
|
||||
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_span::def_id::LocalDefId;
|
||||
use rustc_span::symbol::kw;
|
||||
@ -76,7 +76,7 @@ impl<'tcx> LateLintPass<'tcx> for BoxedLocal {
|
||||
.hir()
|
||||
.get_parent_item(cx.tcx.local_def_id_to_hir_id(fn_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;
|
||||
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
|
||||
fn is_argument(map: rustc_middle::hir::map::Map<'_>, id: HirId) -> bool {
|
||||
match map.find(id) {
|
||||
fn is_argument(tcx: TyCtxt<'_>, id: HirId) -> bool {
|
||||
match tcx.opt_hir_node(id) {
|
||||
Some(Node::Pat(Pat {
|
||||
kind: PatKind::Binding(..),
|
||||
..
|
||||
@ -131,7 +131,7 @@ fn is_argument(map: rustc_middle::hir::map::Map<'_>, id: HirId) -> bool {
|
||||
_ => 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> {
|
||||
@ -154,7 +154,7 @@ impl<'a, 'tcx> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> {
|
||||
fn mutate(&mut self, cmt: &PlaceWithHirId<'tcx>, _: HirId) {
|
||||
if cmt.place.projections.is_empty() {
|
||||
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
|
||||
let parent_id = map.parent_id(cmt.hir_id);
|
||||
if let Some(Node::Expr(..)) = map.find_parent(parent_id) {
|
||||
|
@ -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()
|
||||
&& cx.tcx.is_diagnostic_item(sym::process_exit, 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
|
||||
// and only then emit a linter warning
|
||||
&& !is_entrypoint_fn(cx, parent.to_def_id())
|
||||
|
@ -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
|
||||
&& let ExprKind::Path(QPath::Resolved(None, expr_path)) = expr_end_of_block.kind
|
||||
&& 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
|
||||
&& let PatKind::Binding(BindingAnnotation::NONE, local_hir_id, _ident, None) = local.pat.kind
|
||||
|
@ -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")
|
||||
.did()
|
||||
.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 variants_size = AdtVariantInfo::new(cx, *adt, subst);
|
||||
|
@ -248,7 +248,7 @@ impl<'a, 'tcx> Visitor<'tcx> for SliceIndexLintingVisitor<'a, 'tcx> {
|
||||
|
||||
// Checking for slice indexing
|
||||
&& 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 Some(Constant::Int(index_value)) = constant(cx, cx.typeck_results(), index_expr)
|
||||
&& 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
|
||||
&& 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
|
||||
{
|
||||
use_info.index_use.push((index_value, map.span(parent_expr.hir_id)));
|
||||
|
@ -122,7 +122,7 @@ fn get_impl_span(cx: &LateContext<'_>, id: LocalDefId) -> Option<Span> {
|
||||
kind: ItemKind::Impl(impl_item),
|
||||
span,
|
||||
..
|
||||
}) = cx.tcx.hir().get(id)
|
||||
}) = cx.tcx.hir_node(id)
|
||||
{
|
||||
(!span.from_expansion()
|
||||
&& impl_item.generics.params.is_empty()
|
||||
|
@ -147,7 +147,7 @@ impl<'tcx> LateLintPass<'tcx> for LenZero {
|
||||
&& let Some(output) =
|
||||
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::Item(x)) => match x.kind {
|
||||
ItemKind::Struct(..) => (x.ident.name, "struct"),
|
||||
|
@ -195,7 +195,7 @@ fn check_fn_inner<'tcx>(
|
||||
.iter()
|
||||
// In principle, the result of the call to `Node::ident` could be `unwrap`ped, as `DefId` should refer to a
|
||||
// `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())
|
||||
.collect::<Vec<_>>()
|
||||
.join(", ");
|
||||
|
@ -40,7 +40,7 @@ fn mut_warn_with_span(cx: &LateContext<'_>, span: Option<Span>) {
|
||||
|
||||
fn check_for_mutability(cx: &LateContext<'_>, bound: &Expr<'_>) -> Option<HirId> {
|
||||
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
|
||||
{
|
||||
return Some(hir_id);
|
||||
|
@ -58,12 +58,12 @@ pub(super) fn check<'tcx>(
|
||||
match cx.qpath_res(qpath, pushed_item.hir_id) {
|
||||
// immutable bindings that are initialized with literal or constant
|
||||
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
|
||||
&& let PatKind::Binding(bind_ann, ..) = pat.kind
|
||||
&& !matches!(bind_ann, BindingAnnotation(_, Mutability::Mut))
|
||||
&& 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
|
||||
{
|
||||
match init.kind {
|
||||
|
@ -58,7 +58,7 @@ impl<'tcx> LateLintPass<'tcx> for ManualAsyncFn {
|
||||
&& block.stmts.is_empty()
|
||||
&& let Some(closure_body) = desugared_async_block(cx, block)
|
||||
&& 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());
|
||||
|
||||
|
@ -76,7 +76,7 @@ impl<'tcx> LateLintPass<'tcx> for ManualRemEuclid {
|
||||
// Also ensures the const is nonzero since zero can't be a divisor
|
||||
&& const1 == const2 && const2 == const3
|
||||
&& 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
|
||||
match cx.tcx.hir().find_parent(hir_id) {
|
||||
|
@ -44,7 +44,7 @@ pub(super) fn check<'tcx>(
|
||||
// add note if not multi-line
|
||||
span_lint_and_then(cx, FILTER_NEXT, expr.span, msg, |diag| {
|
||||
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
|
||||
{
|
||||
(Applicability::Unspecified, Some((pat.span, ident)))
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user