Rename hir::Node::Local
into hir::Node::LetStmt
This commit is contained in:
parent
d318bf1009
commit
e0d3439226
43 changed files with 78 additions and 77 deletions
|
@ -303,7 +303,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_local(&mut self, l: &'hir LetStmt<'hir>) {
|
fn visit_local(&mut self, l: &'hir LetStmt<'hir>) {
|
||||||
self.insert(l.span, l.hir_id, Node::Local(l));
|
self.insert(l.span, l.hir_id, Node::LetStmt(l));
|
||||||
self.with_parent(l.hir_id, |this| {
|
self.with_parent(l.hir_id, |this| {
|
||||||
intravisit::walk_local(this, l);
|
intravisit::walk_local(this, l);
|
||||||
})
|
})
|
||||||
|
|
|
@ -800,7 +800,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
for (_, node) in tcx.hir().parent_iter(expr.hir_id) {
|
for (_, node) in tcx.hir().parent_iter(expr.hir_id) {
|
||||||
let e = match node {
|
let e = match node {
|
||||||
hir::Node::Expr(e) => e,
|
hir::Node::Expr(e) => e,
|
||||||
hir::Node::Local(hir::LetStmt { els: Some(els), .. }) => {
|
hir::Node::LetStmt(hir::LetStmt { els: Some(els), .. }) => {
|
||||||
let mut finder = BreakFinder { found_breaks: vec![], found_continues: vec![] };
|
let mut finder = BreakFinder { found_breaks: vec![], found_continues: vec![] };
|
||||||
finder.visit_block(els);
|
finder.visit_block(els);
|
||||||
if !finder.found_breaks.is_empty() {
|
if !finder.found_breaks.is_empty() {
|
||||||
|
|
|
@ -737,7 +737,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||||
&& let body = self.infcx.tcx.hir().body(body_id)
|
&& let body = self.infcx.tcx.hir().body(body_id)
|
||||||
&& let Some(hir_id) = (BindingFinder { span: pat_span }).visit_body(body).break_value()
|
&& let Some(hir_id) = (BindingFinder { span: pat_span }).visit_body(body).break_value()
|
||||||
&& let node = self.infcx.tcx.hir_node(hir_id)
|
&& let node = self.infcx.tcx.hir_node(hir_id)
|
||||||
&& let hir::Node::Local(hir::LetStmt {
|
&& let hir::Node::LetStmt(hir::LetStmt {
|
||||||
pat: hir::Pat { kind: hir::PatKind::Ref(_, _), .. },
|
pat: hir::Pat { kind: hir::PatKind::Ref(_, _), .. },
|
||||||
..
|
..
|
||||||
})
|
})
|
||||||
|
@ -1170,7 +1170,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(hir_id) = hir_id
|
if let Some(hir_id) = hir_id
|
||||||
&& let hir::Node::Local(local) = self.infcx.tcx.hir_node(hir_id)
|
&& let hir::Node::LetStmt(local) = self.infcx.tcx.hir_node(hir_id)
|
||||||
{
|
{
|
||||||
let tables = self.infcx.tcx.typeck(def_id.as_local().unwrap());
|
let tables = self.infcx.tcx.typeck(def_id.as_local().unwrap());
|
||||||
if let Some(clone_trait) = self.infcx.tcx.lang_items().clone_trait()
|
if let Some(clone_trait) = self.infcx.tcx.lang_items().clone_trait()
|
||||||
|
|
|
@ -3529,7 +3529,7 @@ pub enum Node<'hir> {
|
||||||
PatField(&'hir PatField<'hir>),
|
PatField(&'hir PatField<'hir>),
|
||||||
Arm(&'hir Arm<'hir>),
|
Arm(&'hir Arm<'hir>),
|
||||||
Block(&'hir Block<'hir>),
|
Block(&'hir Block<'hir>),
|
||||||
Local(&'hir LetStmt<'hir>),
|
LetStmt(&'hir LetStmt<'hir>),
|
||||||
/// `Ctor` refers to the constructor of an enum variant or struct. Only tuple or unit variants
|
/// `Ctor` refers to the constructor of an enum variant or struct. Only tuple or unit variants
|
||||||
/// with synthesized constructors.
|
/// with synthesized constructors.
|
||||||
Ctor(&'hir VariantData<'hir>),
|
Ctor(&'hir VariantData<'hir>),
|
||||||
|
@ -3585,7 +3585,7 @@ impl<'hir> Node<'hir> {
|
||||||
| Node::Ctor(..)
|
| Node::Ctor(..)
|
||||||
| Node::Pat(..)
|
| Node::Pat(..)
|
||||||
| Node::Arm(..)
|
| Node::Arm(..)
|
||||||
| Node::Local(..)
|
| Node::LetStmt(..)
|
||||||
| Node::Crate(..)
|
| Node::Crate(..)
|
||||||
| Node::Ty(..)
|
| Node::Ty(..)
|
||||||
| Node::TraitRef(..)
|
| Node::TraitRef(..)
|
||||||
|
@ -3757,7 +3757,7 @@ impl<'hir> Node<'hir> {
|
||||||
expect_pat_field, &'hir PatField<'hir>, Node::PatField(n), n;
|
expect_pat_field, &'hir PatField<'hir>, Node::PatField(n), n;
|
||||||
expect_arm, &'hir Arm<'hir>, Node::Arm(n), n;
|
expect_arm, &'hir Arm<'hir>, Node::Arm(n), n;
|
||||||
expect_block, &'hir Block<'hir>, Node::Block(n), n;
|
expect_block, &'hir Block<'hir>, Node::Block(n), n;
|
||||||
expect_let_stmt, &'hir LetStmt<'hir>, Node::Local(n), n;
|
expect_let_stmt, &'hir LetStmt<'hir>, Node::LetStmt(n), n;
|
||||||
expect_ctor, &'hir VariantData<'hir>, Node::Ctor(n), n;
|
expect_ctor, &'hir VariantData<'hir>, Node::Ctor(n), n;
|
||||||
expect_lifetime, &'hir Lifetime, Node::Lifetime(n), n;
|
expect_lifetime, &'hir Lifetime, Node::Lifetime(n), n;
|
||||||
expect_generic_param, &'hir GenericParam<'hir>, Node::GenericParam(n), n;
|
expect_generic_param, &'hir GenericParam<'hir>, Node::GenericParam(n), n;
|
||||||
|
|
|
@ -113,7 +113,7 @@ impl<'a> State<'a> {
|
||||||
// `hir_map` to reconstruct their full structure for pretty
|
// `hir_map` to reconstruct their full structure for pretty
|
||||||
// printing.
|
// printing.
|
||||||
Node::Ctor(..) => panic!("cannot print isolated Ctor"),
|
Node::Ctor(..) => panic!("cannot print isolated Ctor"),
|
||||||
Node::Local(a) => self.print_local_decl(a),
|
Node::LetStmt(a) => self.print_local_decl(a),
|
||||||
Node::Crate(..) => panic!("cannot print Crate"),
|
Node::Crate(..) => panic!("cannot print Crate"),
|
||||||
Node::WhereBoundPredicate(pred) => {
|
Node::WhereBoundPredicate(pred) => {
|
||||||
self.print_formal_generic_params(pred.bound_generic_params);
|
self.print_formal_generic_params(pred.bound_generic_params);
|
||||||
|
|
|
@ -408,7 +408,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let hir::Node::Local(hir::LetStmt { ty: Some(_), pat, .. }) = node {
|
if let hir::Node::LetStmt(hir::LetStmt { ty: Some(_), pat, .. }) = node {
|
||||||
return Some((pat.span, "expected because of this assignment".to_string()));
|
return Some((pat.span, "expected because of this assignment".to_string()));
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
|
|
|
@ -299,8 +299,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
let (init_ty_hir_id, init) = match self.tcx.parent_hir_node(pat.hir_id) {
|
let (init_ty_hir_id, init) = match self.tcx.parent_hir_node(pat.hir_id) {
|
||||||
hir::Node::Local(hir::LetStmt { ty: Some(ty), init, .. }) => (ty.hir_id, *init),
|
hir::Node::LetStmt(hir::LetStmt { ty: Some(ty), init, .. }) => (ty.hir_id, *init),
|
||||||
hir::Node::Local(hir::LetStmt { init: Some(init), .. }) => (init.hir_id, Some(*init)),
|
hir::Node::LetStmt(hir::LetStmt { init: Some(init), .. }) => (init.hir_id, Some(*init)),
|
||||||
_ => return false,
|
_ => return false,
|
||||||
};
|
};
|
||||||
let Some(init_ty) = self.node_ty_opt(init_ty_hir_id) else {
|
let Some(init_ty) = self.node_ty_opt(init_ty_hir_id) else {
|
||||||
|
@ -678,7 +678,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
error: Option<TypeError<'tcx>>,
|
error: Option<TypeError<'tcx>>,
|
||||||
) {
|
) {
|
||||||
match (self.tcx.parent_hir_node(expr.hir_id), error) {
|
match (self.tcx.parent_hir_node(expr.hir_id), error) {
|
||||||
(hir::Node::Local(hir::LetStmt { ty: Some(ty), init: Some(init), .. }), _)
|
(hir::Node::LetStmt(hir::LetStmt { ty: Some(ty), init: Some(init), .. }), _)
|
||||||
if init.hir_id == expr.hir_id =>
|
if init.hir_id == expr.hir_id =>
|
||||||
{
|
{
|
||||||
// Point at `let` assignment type.
|
// Point at `let` assignment type.
|
||||||
|
@ -724,11 +724,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
primary_span = pat.span;
|
primary_span = pat.span;
|
||||||
secondary_span = pat.span;
|
secondary_span = pat.span;
|
||||||
match self.tcx.parent_hir_node(pat.hir_id) {
|
match self.tcx.parent_hir_node(pat.hir_id) {
|
||||||
hir::Node::Local(hir::LetStmt { ty: Some(ty), .. }) => {
|
hir::Node::LetStmt(hir::LetStmt { ty: Some(ty), .. }) => {
|
||||||
primary_span = ty.span;
|
primary_span = ty.span;
|
||||||
post_message = " type";
|
post_message = " type";
|
||||||
}
|
}
|
||||||
hir::Node::Local(hir::LetStmt { init: Some(init), .. }) => {
|
hir::Node::LetStmt(hir::LetStmt { init: Some(init), .. }) => {
|
||||||
primary_span = init.span;
|
primary_span = init.span;
|
||||||
post_message = " value";
|
post_message = " value";
|
||||||
}
|
}
|
||||||
|
|
|
@ -1452,7 +1452,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
});
|
});
|
||||||
let Some((
|
let Some((
|
||||||
_,
|
_,
|
||||||
hir::Node::Local(hir::LetStmt { ty: Some(ty), .. })
|
hir::Node::LetStmt(hir::LetStmt { ty: Some(ty), .. })
|
||||||
| hir::Node::Item(hir::Item { kind: hir::ItemKind::Const(ty, _, _), .. }),
|
| hir::Node::Item(hir::Item { kind: hir::ItemKind::Const(ty, _, _), .. }),
|
||||||
)) = parent_node
|
)) = parent_node
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -318,7 +318,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
);
|
);
|
||||||
expr_id = parent_id;
|
expr_id = parent_id;
|
||||||
}
|
}
|
||||||
Node::Local(local) => {
|
Node::LetStmt(local) => {
|
||||||
if let Some(mut ty) = local.ty {
|
if let Some(mut ty) = local.ty {
|
||||||
while let Some(index) = tuple_indexes.pop() {
|
while let Some(index) = tuple_indexes.pop() {
|
||||||
match ty.kind {
|
match ty.kind {
|
||||||
|
@ -1331,7 +1331,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
// ++++++++++
|
// ++++++++++
|
||||||
// since the user probably just misunderstood how `let else`
|
// since the user probably just misunderstood how `let else`
|
||||||
// and `&&` work together.
|
// and `&&` work together.
|
||||||
if let Some((_, hir::Node::Local(local))) = cond_parent
|
if let Some((_, hir::Node::LetStmt(local))) = cond_parent
|
||||||
&& let hir::PatKind::Path(qpath) | hir::PatKind::TupleStruct(qpath, _, _) =
|
&& let hir::PatKind::Path(qpath) | hir::PatKind::TupleStruct(qpath, _, _) =
|
||||||
&local.pat.kind
|
&local.pat.kind
|
||||||
&& let hir::QPath::Resolved(None, path) = qpath
|
&& let hir::QPath::Resolved(None, path) = qpath
|
||||||
|
@ -1731,7 +1731,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
|
|
||||||
match self.tcx.parent_hir_node(*hir_id) {
|
match self.tcx.parent_hir_node(*hir_id) {
|
||||||
// foo.clone()
|
// foo.clone()
|
||||||
hir::Node::Local(hir::LetStmt { init: Some(init), .. }) => {
|
hir::Node::LetStmt(hir::LetStmt { init: Some(init), .. }) => {
|
||||||
self.note_type_is_not_clone_inner_expr(init)
|
self.note_type_is_not_clone_inner_expr(init)
|
||||||
}
|
}
|
||||||
// When `expr` is more complex like a tuple
|
// When `expr` is more complex like a tuple
|
||||||
|
@ -1740,7 +1740,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
kind: hir::PatKind::Tuple(pats, ..),
|
kind: hir::PatKind::Tuple(pats, ..),
|
||||||
..
|
..
|
||||||
}) => {
|
}) => {
|
||||||
let hir::Node::Local(hir::LetStmt { init: Some(init), .. }) =
|
let hir::Node::LetStmt(hir::LetStmt { init: Some(init), .. }) =
|
||||||
self.tcx.parent_hir_node(*pat_hir_id)
|
self.tcx.parent_hir_node(*pat_hir_id)
|
||||||
else {
|
else {
|
||||||
return expr;
|
return expr;
|
||||||
|
@ -1774,7 +1774,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
&& let hir::Path { segments: [_], res: crate::Res::Local(binding), .. } =
|
&& let hir::Path { segments: [_], res: crate::Res::Local(binding), .. } =
|
||||||
call_expr_path
|
call_expr_path
|
||||||
&& let hir::Node::Pat(hir::Pat { hir_id, .. }) = self.tcx.hir_node(*binding)
|
&& let hir::Node::Pat(hir::Pat { hir_id, .. }) = self.tcx.hir_node(*binding)
|
||||||
&& let hir::Node::Local(hir::LetStmt { init: Some(init), .. }) =
|
&& let hir::Node::LetStmt(hir::LetStmt { init: Some(init), .. }) =
|
||||||
self.tcx.parent_hir_node(*hir_id)
|
self.tcx.parent_hir_node(*hir_id)
|
||||||
&& let Expr {
|
&& let Expr {
|
||||||
kind: hir::ExprKind::Closure(hir::Closure { body: body_id, .. }),
|
kind: hir::ExprKind::Closure(hir::Closure { body: body_id, .. }),
|
||||||
|
@ -3134,7 +3134,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
let hir::Node::Pat(pat) = self.tcx.hir_node(hir_id) else {
|
let hir::Node::Pat(pat) = self.tcx.hir_node(hir_id) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let hir::Node::Local(hir::LetStmt { ty: None, init: Some(init), .. }) =
|
let hir::Node::LetStmt(hir::LetStmt { ty: None, init: Some(init), .. }) =
|
||||||
self.tcx.parent_hir_node(pat.hir_id)
|
self.tcx.parent_hir_node(pat.hir_id)
|
||||||
else {
|
else {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -2166,7 +2166,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
match (filename, parent_node) {
|
match (filename, parent_node) {
|
||||||
(
|
(
|
||||||
FileName::Real(_),
|
FileName::Real(_),
|
||||||
Node::Local(hir::LetStmt {
|
Node::LetStmt(hir::LetStmt {
|
||||||
source: hir::LocalSource::Normal,
|
source: hir::LocalSource::Normal,
|
||||||
ty,
|
ty,
|
||||||
..
|
..
|
||||||
|
|
|
@ -744,7 +744,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
|
|
||||||
let ident_kind = match binding_parent {
|
let ident_kind = match binding_parent {
|
||||||
hir::Node::Param(_) => "parameter",
|
hir::Node::Param(_) => "parameter",
|
||||||
hir::Node::Local(_) => "variable",
|
hir::Node::LetStmt(_) => "variable",
|
||||||
hir::Node::Arm(_) => "binding",
|
hir::Node::Arm(_) => "binding",
|
||||||
|
|
||||||
// Provide diagnostics only if the parent pattern is struct-like,
|
// Provide diagnostics only if the parent pattern is struct-like,
|
||||||
|
|
|
@ -321,7 +321,8 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
&& let Some(expr) = block.expr
|
&& let Some(expr) = block.expr
|
||||||
&& let hir::ExprKind::Path(QPath::Resolved(_, Path { res, .. })) = expr.kind
|
&& let hir::ExprKind::Path(QPath::Resolved(_, Path { res, .. })) = expr.kind
|
||||||
&& let Res::Local(local) = res
|
&& let Res::Local(local) = res
|
||||||
&& let Node::Local(LetStmt { init: Some(init), .. }) = self.tcx.parent_hir_node(*local)
|
&& let Node::LetStmt(LetStmt { init: Some(init), .. }) =
|
||||||
|
self.tcx.parent_hir_node(*local)
|
||||||
{
|
{
|
||||||
fn collect_blocks<'hir>(expr: &hir::Expr<'hir>, blocks: &mut Vec<&hir::Block<'hir>>) {
|
fn collect_blocks<'hir>(expr: &hir::Expr<'hir>, blocks: &mut Vec<&hir::Block<'hir>>) {
|
||||||
match expr.kind {
|
match expr.kind {
|
||||||
|
|
|
@ -937,7 +937,7 @@ impl<'tcx> LateContext<'tcx> {
|
||||||
}
|
}
|
||||||
&& let Some(init) = match parent_node {
|
&& let Some(init) = match parent_node {
|
||||||
hir::Node::Expr(expr) => Some(expr),
|
hir::Node::Expr(expr) => Some(expr),
|
||||||
hir::Node::Local(hir::LetStmt { init, .. }) => *init,
|
hir::Node::LetStmt(hir::LetStmt { init, .. }) => *init,
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -982,7 +982,7 @@ impl<'tcx> LateContext<'tcx> {
|
||||||
}
|
}
|
||||||
&& let Some(init) = match parent_node {
|
&& let Some(init) = match parent_node {
|
||||||
hir::Node::Expr(expr) => Some(expr),
|
hir::Node::Expr(expr) => Some(expr),
|
||||||
hir::Node::Local(hir::LetStmt { init, .. }) => *init,
|
hir::Node::LetStmt(hir::LetStmt { init, .. }) => *init,
|
||||||
hir::Node::Item(item) => match item.kind {
|
hir::Node::Item(item) => match item.kind {
|
||||||
hir::ItemKind::Const(.., body_id) | hir::ItemKind::Static(.., body_id) => {
|
hir::ItemKind::Const(.., body_id) | hir::ItemKind::Static(.., body_id) => {
|
||||||
Some(self.tcx.hir().body(body_id).value)
|
Some(self.tcx.hir().body(body_id).value)
|
||||||
|
|
|
@ -567,7 +567,7 @@ impl<'hir> Map<'hir> {
|
||||||
}
|
}
|
||||||
// Ignore `return`s on the first iteration
|
// Ignore `return`s on the first iteration
|
||||||
Node::Expr(Expr { kind: ExprKind::Loop(..) | ExprKind::Ret(..), .. })
|
Node::Expr(Expr { kind: ExprKind::Loop(..) | ExprKind::Ret(..), .. })
|
||||||
| Node::Local(_) => {
|
| Node::LetStmt(_) => {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
@ -906,7 +906,7 @@ impl<'hir> Map<'hir> {
|
||||||
Node::Lifetime(lifetime) => lifetime.ident.span,
|
Node::Lifetime(lifetime) => lifetime.ident.span,
|
||||||
Node::GenericParam(param) => param.span,
|
Node::GenericParam(param) => param.span,
|
||||||
Node::Infer(i) => i.span,
|
Node::Infer(i) => i.span,
|
||||||
Node::Local(local) => local.span,
|
Node::LetStmt(local) => local.span,
|
||||||
Node::Crate(item) => item.spans.inner_span,
|
Node::Crate(item) => item.spans.inner_span,
|
||||||
Node::WhereBoundPredicate(pred) => pred.span,
|
Node::WhereBoundPredicate(pred) => pred.span,
|
||||||
Node::ArrayLenInfer(inf) => inf.span,
|
Node::ArrayLenInfer(inf) => inf.span,
|
||||||
|
@ -1163,7 +1163,7 @@ fn hir_id_to_string(map: Map<'_>, id: HirId) -> String {
|
||||||
Node::Arm(_) => node_str("arm"),
|
Node::Arm(_) => node_str("arm"),
|
||||||
Node::Block(_) => node_str("block"),
|
Node::Block(_) => node_str("block"),
|
||||||
Node::Infer(_) => node_str("infer"),
|
Node::Infer(_) => node_str("infer"),
|
||||||
Node::Local(_) => node_str("local"),
|
Node::LetStmt(_) => node_str("local"),
|
||||||
Node::Ctor(ctor) => format!(
|
Node::Ctor(ctor) => format!(
|
||||||
"{id} (ctor {})",
|
"{id} (ctor {})",
|
||||||
ctor.ctor_def_id().map_or("<missing path>".into(), |def_id| path_str(def_id)),
|
ctor.ctor_def_id().map_or("<missing path>".into(), |def_id| path_str(def_id)),
|
||||||
|
|
|
@ -768,7 +768,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
}
|
}
|
||||||
// Different to previous arm because one is `&hir::Local` and the other
|
// Different to previous arm because one is `&hir::Local` and the other
|
||||||
// is `P<hir::Local>`.
|
// is `P<hir::Local>`.
|
||||||
hir::Node::Local(local) => get_name(err, &local.pat.kind),
|
hir::Node::LetStmt(local) => get_name(err, &local.pat.kind),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -930,7 +930,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
let hir::Node::Pat(pat) = self.tcx.hir_node(hir_id) else {
|
let hir::Node::Pat(pat) = self.tcx.hir_node(hir_id) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let hir::Node::Local(hir::LetStmt { ty: None, init: Some(init), .. }) =
|
let hir::Node::LetStmt(hir::LetStmt { ty: None, init: Some(init), .. }) =
|
||||||
self.tcx.parent_hir_node(pat.hir_id)
|
self.tcx.parent_hir_node(pat.hir_id)
|
||||||
else {
|
else {
|
||||||
return;
|
return;
|
||||||
|
@ -1562,7 +1562,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = expr.kind
|
if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = expr.kind
|
||||||
&& let Res::Local(hir_id) = path.res
|
&& let Res::Local(hir_id) = path.res
|
||||||
&& let hir::Node::Pat(binding) = self.tcx.hir_node(hir_id)
|
&& let hir::Node::Pat(binding) = self.tcx.hir_node(hir_id)
|
||||||
&& let hir::Node::Local(local) = self.tcx.parent_hir_node(binding.hir_id)
|
&& let hir::Node::LetStmt(local) = self.tcx.parent_hir_node(binding.hir_id)
|
||||||
&& let None = local.ty
|
&& let None = local.ty
|
||||||
&& let Some(binding_expr) = local.init
|
&& let Some(binding_expr) = local.init
|
||||||
{
|
{
|
||||||
|
@ -2966,7 +2966,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
err.downgrade_to_delayed_bug();
|
err.downgrade_to_delayed_bug();
|
||||||
}
|
}
|
||||||
match tcx.parent_hir_node(hir_id) {
|
match tcx.parent_hir_node(hir_id) {
|
||||||
Node::Local(hir::LetStmt { ty: Some(ty), .. }) => {
|
Node::LetStmt(hir::LetStmt { ty: Some(ty), .. }) => {
|
||||||
err.span_suggestion_verbose(
|
err.span_suggestion_verbose(
|
||||||
ty.span.shrink_to_lo(),
|
ty.span.shrink_to_lo(),
|
||||||
"consider borrowing here",
|
"consider borrowing here",
|
||||||
|
@ -2975,7 +2975,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
);
|
);
|
||||||
err.note("all local variables must have a statically known size");
|
err.note("all local variables must have a statically known size");
|
||||||
}
|
}
|
||||||
Node::Local(hir::LetStmt {
|
Node::LetStmt(hir::LetStmt {
|
||||||
init: Some(hir::Expr { kind: hir::ExprKind::Index(..), span, .. }),
|
init: Some(hir::Expr { kind: hir::ExprKind::Index(..), span, .. }),
|
||||||
..
|
..
|
||||||
}) => {
|
}) => {
|
||||||
|
@ -3867,7 +3867,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = expr.kind
|
if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = expr.kind
|
||||||
&& let hir::Path { res: Res::Local(hir_id), .. } = path
|
&& let hir::Path { res: Res::Local(hir_id), .. } = path
|
||||||
&& let hir::Node::Pat(binding) = self.tcx.hir_node(*hir_id)
|
&& let hir::Node::Pat(binding) = self.tcx.hir_node(*hir_id)
|
||||||
&& let hir::Node::Local(local) = self.tcx.parent_hir_node(binding.hir_id)
|
&& let hir::Node::LetStmt(local) = self.tcx.parent_hir_node(binding.hir_id)
|
||||||
&& let Some(binding_expr) = local.init
|
&& let Some(binding_expr) = local.init
|
||||||
{
|
{
|
||||||
// If the expression we're calling on is a binding, we want to point at the
|
// If the expression we're calling on is a binding, we want to point at the
|
||||||
|
@ -4128,7 +4128,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
{
|
{
|
||||||
let parent = self.tcx.parent_hir_node(binding.hir_id);
|
let parent = self.tcx.parent_hir_node(binding.hir_id);
|
||||||
// We've reached the root of the method call chain...
|
// We've reached the root of the method call chain...
|
||||||
if let hir::Node::Local(local) = parent
|
if let hir::Node::LetStmt(local) = parent
|
||||||
&& let Some(binding_expr) = local.init
|
&& let Some(binding_expr) = local.init
|
||||||
{
|
{
|
||||||
// ...and it is a binding. Get the binding creation and continue the chain.
|
// ...and it is a binding. Get the binding creation and continue the chain.
|
||||||
|
|
|
@ -1272,7 +1272,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
{
|
{
|
||||||
let parent = self.tcx.parent_hir_node(binding.hir_id);
|
let parent = self.tcx.parent_hir_node(binding.hir_id);
|
||||||
// We've reached the root of the method call chain...
|
// We've reached the root of the method call chain...
|
||||||
if let hir::Node::Local(local) = parent
|
if let hir::Node::LetStmt(local) = parent
|
||||||
&& let Some(binding_expr) = local.init
|
&& let Some(binding_expr) = local.init
|
||||||
{
|
{
|
||||||
// ...and it is a binding. Get the binding creation and continue the chain.
|
// ...and it is a binding. Get the binding creation and continue the chain.
|
||||||
|
|
|
@ -163,7 +163,7 @@ fn is_ok_to_suggest<'tcx>(cx: &LateContext<'tcx>, lhs: &Expr<'tcx>, call: &CallC
|
||||||
// TODO: This check currently bails if the local variable has no initializer.
|
// TODO: This check currently bails if the local variable has no initializer.
|
||||||
// That is overly conservative - the lint should fire even if there was no initializer,
|
// That is overly conservative - the lint should fire even if there was no initializer,
|
||||||
// but the variable has been initialized before `lhs` was evaluated.
|
// but the variable has been initialized before `lhs` was evaluated.
|
||||||
if let Some(Node::Local(local)) = cx.tcx.hir().parent_id_iter(local).next().map(|p| cx.tcx.hir_node(p))
|
if let Some(Node::LetStmt(local)) = cx.tcx.hir().parent_id_iter(local).next().map(|p| cx.tcx.hir_node(p))
|
||||||
&& local.init.is_none()
|
&& local.init.is_none()
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -139,7 +139,7 @@ impl<'tcx> Visitor<'tcx> for InferVisitor {
|
||||||
|
|
||||||
fn given_type(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
fn given_type(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
||||||
match cx.tcx.parent_hir_node(expr.hir_id) {
|
match cx.tcx.parent_hir_node(expr.hir_id) {
|
||||||
Node::Local(LetStmt { ty: Some(ty), .. }) => {
|
Node::LetStmt(LetStmt { ty: Some(ty), .. }) => {
|
||||||
let mut v = InferVisitor::default();
|
let mut v = InferVisitor::default();
|
||||||
v.visit_ty(ty);
|
v.visit_ty(ty);
|
||||||
!v.0
|
!v.0
|
||||||
|
|
|
@ -24,7 +24,7 @@ pub(super) fn check<'tcx>(
|
||||||
&& let ty::RawPtr(TypeAndMut { mutbl: to_mutbl, .. }) = cast_to.kind()
|
&& let ty::RawPtr(TypeAndMut { mutbl: to_mutbl, .. }) = cast_to.kind()
|
||||||
&& let Some(use_cx) = expr_use_ctxt(cx, expr)
|
&& let Some(use_cx) = expr_use_ctxt(cx, expr)
|
||||||
// TODO: only block the lint if `cast_expr` is a temporary
|
// TODO: only block the lint if `cast_expr` is a temporary
|
||||||
&& !matches!(use_cx.node, ExprUseNode::Local(_) | ExprUseNode::ConstStatic(_))
|
&& !matches!(use_cx.node, ExprUseNode::LetStmt(_) | ExprUseNode::ConstStatic(_))
|
||||||
{
|
{
|
||||||
let core_or_std = if is_no_std_crate(cx) { "core" } else { "std" };
|
let core_or_std = if is_no_std_crate(cx) { "core" } else { "std" };
|
||||||
let fn_name = match to_mutbl {
|
let fn_name = match to_mutbl {
|
||||||
|
|
|
@ -66,7 +66,7 @@ pub(super) fn check<'tcx>(
|
||||||
&& let QPath::Resolved(None, Path { res, .. }) = qpath
|
&& let QPath::Resolved(None, Path { res, .. }) = qpath
|
||||||
&& let Res::Local(hir_id) = res
|
&& let Res::Local(hir_id) = res
|
||||||
&& let parent = cx.tcx.parent_hir_node(*hir_id)
|
&& let parent = cx.tcx.parent_hir_node(*hir_id)
|
||||||
&& let Node::Local(local) = parent
|
&& let Node::LetStmt(local) = parent
|
||||||
{
|
{
|
||||||
if let Some(ty) = local.ty
|
if let Some(ty) = local.ty
|
||||||
&& let TyKind::Path(qpath) = ty.kind
|
&& let TyKind::Path(qpath) = ty.kind
|
||||||
|
@ -275,7 +275,7 @@ fn is_cast_from_ty_alias<'tcx>(cx: &LateContext<'tcx>, expr: impl Visitable<'tcx
|
||||||
}
|
}
|
||||||
// Local usage
|
// Local usage
|
||||||
} else if let Res::Local(hir_id) = res
|
} else if let Res::Local(hir_id) = res
|
||||||
&& let Node::Local(l) = cx.tcx.parent_hir_node(hir_id)
|
&& let Node::LetStmt(l) = cx.tcx.parent_hir_node(hir_id)
|
||||||
{
|
{
|
||||||
if let Some(e) = l.init
|
if let Some(e) = l.init
|
||||||
&& is_cast_from_ty_alias(cx, e, cast_from)
|
&& is_cast_from_ty_alias(cx, e, cast_from)
|
||||||
|
|
|
@ -46,7 +46,7 @@ impl<'tcx> LateLintPass<'tcx> for IgnoredUnitPatterns {
|
||||||
// Ignore function parameters
|
// Ignore function parameters
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
Node::Local(local) if local.ty.is_some() => {
|
Node::LetStmt(local) if local.ty.is_some() => {
|
||||||
// Ignore let bindings with explicit type
|
// Ignore let bindings with explicit type
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
|
|
|
@ -62,7 +62,7 @@ pub(super) fn check<'tcx>(
|
||||||
if let Node::Pat(pat) = node
|
if let Node::Pat(pat) = node
|
||||||
&& let PatKind::Binding(bind_ann, ..) = pat.kind
|
&& let PatKind::Binding(bind_ann, ..) = pat.kind
|
||||||
&& !matches!(bind_ann, BindingAnnotation(_, Mutability::Mut))
|
&& !matches!(bind_ann, BindingAnnotation(_, Mutability::Mut))
|
||||||
&& let Node::Local(parent_let_expr) = cx.tcx.parent_hir_node(hir_id)
|
&& let Node::LetStmt(parent_let_expr) = cx.tcx.parent_hir_node(hir_id)
|
||||||
&& let Some(init) = parent_let_expr.init
|
&& let Some(init) = parent_let_expr.init
|
||||||
{
|
{
|
||||||
match init.kind {
|
match init.kind {
|
||||||
|
|
|
@ -81,7 +81,7 @@ impl<'tcx> LateLintPass<'tcx> for ManualRemEuclid {
|
||||||
// Apply only to params or locals with annotated types
|
// Apply only to params or locals with annotated types
|
||||||
match cx.tcx.parent_hir_node(hir_id) {
|
match cx.tcx.parent_hir_node(hir_id) {
|
||||||
Node::Param(..) => (),
|
Node::Param(..) => (),
|
||||||
Node::Local(local) => {
|
Node::LetStmt(local) => {
|
||||||
let Some(ty) = local.ty else { return };
|
let Some(ty) = local.ty else { return };
|
||||||
if matches!(ty.kind, TyKind::Infer) {
|
if matches!(ty.kind, TyKind::Infer) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -148,7 +148,7 @@ pub(crate) fn check<'a>(cx: &LateContext<'a>, ex: &Expr<'a>, arms: &[Arm<'_>], e
|
||||||
fn opt_parent_assign_span<'a>(cx: &LateContext<'a>, ex: &Expr<'a>) -> Option<AssignmentExpr> {
|
fn opt_parent_assign_span<'a>(cx: &LateContext<'a>, ex: &Expr<'a>) -> Option<AssignmentExpr> {
|
||||||
if let Node::Expr(parent_arm_expr) = cx.tcx.parent_hir_node(ex.hir_id) {
|
if let Node::Expr(parent_arm_expr) = cx.tcx.parent_hir_node(ex.hir_id) {
|
||||||
return match cx.tcx.parent_hir_node(parent_arm_expr.hir_id) {
|
return match cx.tcx.parent_hir_node(parent_arm_expr.hir_id) {
|
||||||
Node::Local(parent_let_expr) => Some(AssignmentExpr::Local {
|
Node::LetStmt(parent_let_expr) => Some(AssignmentExpr::Local {
|
||||||
span: parent_let_expr.span,
|
span: parent_let_expr.span,
|
||||||
pat_span: parent_let_expr.pat.span(),
|
pat_span: parent_let_expr.pat.span(),
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -125,7 +125,7 @@ fn strip_return<'hir>(expr: &'hir Expr<'hir>) -> &'hir Expr<'hir> {
|
||||||
fn expr_ty_matches_p_ty(cx: &LateContext<'_>, expr: &Expr<'_>, p_expr: &Expr<'_>) -> bool {
|
fn expr_ty_matches_p_ty(cx: &LateContext<'_>, expr: &Expr<'_>, p_expr: &Expr<'_>) -> bool {
|
||||||
match cx.tcx.parent_hir_node(p_expr.hir_id) {
|
match cx.tcx.parent_hir_node(p_expr.hir_id) {
|
||||||
// Compare match_expr ty with local in `let local = match match_expr {..}`
|
// Compare match_expr ty with local in `let local = match match_expr {..}`
|
||||||
Node::Local(local) => {
|
Node::LetStmt(local) => {
|
||||||
let results = cx.typeck_results();
|
let results = cx.typeck_results();
|
||||||
return same_type_and_consts(results.node_type(local.hir_id), results.expr_ty(expr));
|
return same_type_and_consts(results.node_type(local.hir_id), results.expr_ty(expr));
|
||||||
},
|
},
|
||||||
|
|
|
@ -69,7 +69,7 @@ pub(super) fn check(
|
||||||
_ => false,
|
_ => false,
|
||||||
},
|
},
|
||||||
// local binding capturing a reference
|
// local binding capturing a reference
|
||||||
Node::Local(l) if matches!(l.pat.kind, PatKind::Binding(BindingAnnotation(ByRef::Yes, _), ..)) => {
|
Node::LetStmt(l) if matches!(l.pat.kind, PatKind::Binding(BindingAnnotation(ByRef::Yes, _), ..)) => {
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
_ => false,
|
_ => false,
|
||||||
|
|
|
@ -50,7 +50,7 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, method_name: &str, re
|
||||||
| ExprKind::Break(_, _) => true,
|
| ExprKind::Break(_, _) => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
},
|
},
|
||||||
Some((Node::Stmt(_) | Node::Local(_), _)) => false,
|
Some((Node::Stmt(_) | Node::LetStmt(_), _)) => false,
|
||||||
_ => true,
|
_ => true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,7 @@ pub(super) fn check<'tcx>(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Node::Local(l) => {
|
Node::LetStmt(l) => {
|
||||||
if let PatKind::Binding(BindingAnnotation::NONE | BindingAnnotation::MUT, id, _, None) = l.pat.kind
|
if let PatKind::Binding(BindingAnnotation::NONE | BindingAnnotation::MUT, id, _, None) = l.pat.kind
|
||||||
&& let ty = cx.typeck_results().expr_ty(collect_expr)
|
&& let ty = cx.typeck_results().expr_ty(collect_expr)
|
||||||
&& [sym::Vec, sym::VecDeque, sym::BinaryHeap, sym::LinkedList]
|
&& [sym::Vec, sym::VecDeque, sym::BinaryHeap, sym::LinkedList]
|
||||||
|
|
|
@ -24,7 +24,7 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>, receiver
|
||||||
&& let Node::Expr(unwrap_call_expr) = cx.tcx.parent_hir_node(expr.hir_id)
|
&& let Node::Expr(unwrap_call_expr) = cx.tcx.parent_hir_node(expr.hir_id)
|
||||||
&& is_unwrap_call(cx, unwrap_call_expr)
|
&& is_unwrap_call(cx, unwrap_call_expr)
|
||||||
&& let parent = cx.tcx.parent_hir_node(unwrap_call_expr.hir_id)
|
&& let parent = cx.tcx.parent_hir_node(unwrap_call_expr.hir_id)
|
||||||
&& let Node::Local(local) = parent
|
&& let Node::LetStmt(local) = parent
|
||||||
&& let Some(mir) = enclosing_mir(cx.tcx, expr.hir_id)
|
&& let Some(mir) = enclosing_mir(cx.tcx, expr.hir_id)
|
||||||
&& let Some((local, _)) = mir
|
&& let Some((local, _)) = mir
|
||||||
.local_decls
|
.local_decls
|
||||||
|
|
|
@ -128,7 +128,7 @@ fn check_manual_split_once_indirect(
|
||||||
) -> Option<()> {
|
) -> Option<()> {
|
||||||
let ctxt = expr.span.ctxt();
|
let ctxt = expr.span.ctxt();
|
||||||
let mut parents = cx.tcx.hir().parent_iter(expr.hir_id);
|
let mut parents = cx.tcx.hir().parent_iter(expr.hir_id);
|
||||||
if let (_, Node::Local(local)) = parents.next()?
|
if let (_, Node::LetStmt(local)) = parents.next()?
|
||||||
&& let PatKind::Binding(BindingAnnotation::MUT, iter_binding_id, iter_ident, None) = local.pat.kind
|
&& let PatKind::Binding(BindingAnnotation::MUT, iter_binding_id, iter_ident, None) = local.pat.kind
|
||||||
&& let (iter_stmt_id, Node::Stmt(_)) = parents.next()?
|
&& let (iter_stmt_id, Node::Stmt(_)) = parents.next()?
|
||||||
&& let (_, Node::Block(enclosing_block)) = parents.next()?
|
&& let (_, Node::Block(enclosing_block)) = parents.next()?
|
||||||
|
|
|
@ -20,7 +20,7 @@ fn needs_turbofish(cx: &LateContext<'_>, expr: &hir::Expr<'_>) -> bool {
|
||||||
|
|
||||||
// some common cases where turbofish isn't needed:
|
// some common cases where turbofish isn't needed:
|
||||||
// - assigned to a local variable with a type annotation
|
// - assigned to a local variable with a type annotation
|
||||||
if let hir::Node::Local(local) = parent
|
if let hir::Node::LetStmt(local) = parent
|
||||||
&& local.ty.is_some()
|
&& local.ty.is_some()
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -604,7 +604,7 @@ fn check_ptr_arg_usage<'tcx>(cx: &LateContext<'tcx>, body: &'tcx Body<'_>, args:
|
||||||
|
|
||||||
match get_expr_use_or_unification_node(self.cx.tcx, e) {
|
match get_expr_use_or_unification_node(self.cx.tcx, e) {
|
||||||
Some((Node::Stmt(_), _)) => (),
|
Some((Node::Stmt(_), _)) => (),
|
||||||
Some((Node::Local(l), _)) => {
|
Some((Node::LetStmt(l), _)) => {
|
||||||
// Only trace simple bindings. e.g `let x = y;`
|
// Only trace simple bindings. e.g `let x = y;`
|
||||||
if let PatKind::Binding(BindingAnnotation::NONE, id, _, None) = l.pat.kind {
|
if let PatKind::Binding(BindingAnnotation::NONE, id, _, None) = l.pat.kind {
|
||||||
self.bindings.insert(id, args_idx);
|
self.bindings.insert(id, args_idx);
|
||||||
|
|
|
@ -241,7 +241,7 @@ fn find_init<'tcx>(cx: &LateContext<'tcx>, hir_id: HirId) -> Option<&'tcx Expr<'
|
||||||
ExprKind::Match(e, _, _) | ExprKind::Let(&LetExpr { init: e, .. }) => Some(e),
|
ExprKind::Match(e, _, _) | ExprKind::Let(&LetExpr { init: e, .. }) => Some(e),
|
||||||
_ => None,
|
_ => None,
|
||||||
},
|
},
|
||||||
Node::Local(local) => local.init,
|
Node::LetStmt(local) => local.init,
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
return init;
|
return init;
|
||||||
|
|
|
@ -159,7 +159,7 @@ fn all_bindings_are_for_conv<'tcx>(
|
||||||
.iter()
|
.iter()
|
||||||
.map(|node| match node {
|
.map(|node| match node {
|
||||||
Node::Pat(pat) => kind.eq(&pat.kind).then_some(pat.hir_id),
|
Node::Pat(pat) => kind.eq(&pat.kind).then_some(pat.hir_id),
|
||||||
Node::Local(l) => Some(l.hir_id),
|
Node::LetStmt(l) => Some(l.hir_id),
|
||||||
_ => None,
|
_ => None,
|
||||||
})
|
})
|
||||||
.all_equal()
|
.all_equal()
|
||||||
|
@ -170,7 +170,7 @@ fn all_bindings_are_for_conv<'tcx>(
|
||||||
&& local_parents.first().is_some_and(|node| {
|
&& local_parents.first().is_some_and(|node| {
|
||||||
let Some(ty) = match node {
|
let Some(ty) = match node {
|
||||||
Node::Pat(pat) => Some(pat.hir_id),
|
Node::Pat(pat) => Some(pat.hir_id),
|
||||||
Node::Local(l) => Some(l.hir_id),
|
Node::LetStmt(l) => Some(l.hir_id),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
.map(|hir_id| cx.typeck_results().node_type(hir_id)) else {
|
.map(|hir_id| cx.typeck_results().node_type(hir_id)) else {
|
||||||
|
|
|
@ -342,7 +342,7 @@ fn block_parents_have_safety_comment(
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let (span, hir_id) = match cx.tcx.parent_hir_node(id) {
|
let (span, hir_id) = match cx.tcx.parent_hir_node(id) {
|
||||||
Node::Expr(expr) => match cx.tcx.parent_hir_node(expr.hir_id) {
|
Node::Expr(expr) => match cx.tcx.parent_hir_node(expr.hir_id) {
|
||||||
Node::Local(hir::LetStmt { span, hir_id, .. }) => (*span, *hir_id),
|
Node::LetStmt(hir::LetStmt { span, hir_id, .. }) => (*span, *hir_id),
|
||||||
Node::Item(hir::Item {
|
Node::Item(hir::Item {
|
||||||
kind: hir::ItemKind::Const(..) | ItemKind::Static(..),
|
kind: hir::ItemKind::Const(..) | ItemKind::Static(..),
|
||||||
span,
|
span,
|
||||||
|
@ -363,7 +363,7 @@ fn block_parents_have_safety_comment(
|
||||||
| hir::StmtKind::Semi(hir::Expr { span, hir_id, .. }),
|
| hir::StmtKind::Semi(hir::Expr { span, hir_id, .. }),
|
||||||
..
|
..
|
||||||
})
|
})
|
||||||
| Node::Local(hir::LetStmt { span, hir_id, .. }) => (*span, *hir_id),
|
| Node::LetStmt(hir::LetStmt { span, hir_id, .. }) => (*span, *hir_id),
|
||||||
Node::Item(hir::Item {
|
Node::Item(hir::Item {
|
||||||
kind: hir::ItemKind::Const(..) | ItemKind::Static(..),
|
kind: hir::ItemKind::Const(..) | ItemKind::Static(..),
|
||||||
span,
|
span,
|
||||||
|
@ -603,7 +603,7 @@ fn get_body_search_span(cx: &LateContext<'_>) -> Option<Span> {
|
||||||
for (_, node) in map.parent_iter(body.hir_id) {
|
for (_, node) in map.parent_iter(body.hir_id) {
|
||||||
match node {
|
match node {
|
||||||
Node::Expr(e) => span = e.span,
|
Node::Expr(e) => span = e.span,
|
||||||
Node::Block(_) | Node::Arm(_) | Node::Stmt(_) | Node::Local(_) => (),
|
Node::Block(_) | Node::Arm(_) | Node::Stmt(_) | Node::LetStmt(_) => (),
|
||||||
Node::Item(hir::Item {
|
Node::Item(hir::Item {
|
||||||
kind: hir::ItemKind::Const(..) | ItemKind::Static(..),
|
kind: hir::ItemKind::Const(..) | ItemKind::Static(..),
|
||||||
..
|
..
|
||||||
|
|
|
@ -102,7 +102,7 @@ fn expr_needs_inferred_result<'tcx>(cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) -
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
while let Some(id) = locals_to_check.pop() {
|
while let Some(id) = locals_to_check.pop() {
|
||||||
if let Node::Local(l) = cx.tcx.parent_hir_node(id) {
|
if let Node::LetStmt(l) = cx.tcx.parent_hir_node(id) {
|
||||||
if !l.ty.map_or(true, |ty| matches!(ty.kind, TyKind::Infer)) {
|
if !l.ty.map_or(true, |ty| matches!(ty.kind, TyKind::Infer)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -190,7 +190,7 @@ impl<'tcx> Visitor<'tcx> for PeekableVisitor<'_, 'tcx> {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Node::Local(LetStmt { init: Some(init), .. }) => {
|
Node::LetStmt(LetStmt { init: Some(init), .. }) => {
|
||||||
if arg_is_mut_peekable(self.cx, init) {
|
if arg_is_mut_peekable(self.cx, init) {
|
||||||
self.found_peek_call = true;
|
self.found_peek_call = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1006,7 +1006,7 @@ fn get_parent_local<'hir>(cx: &LateContext<'hir>, expr: &'hir hir::Expr<'hir>) -
|
||||||
|
|
||||||
fn get_parent_local_hir_id<'hir>(cx: &LateContext<'hir>, hir_id: hir::HirId) -> Option<&'hir hir::Local<'hir>> {
|
fn get_parent_local_hir_id<'hir>(cx: &LateContext<'hir>, hir_id: hir::HirId) -> Option<&'hir hir::Local<'hir>> {
|
||||||
match cx.tcx.parent_hir_node(hir_id) {
|
match cx.tcx.parent_hir_node(hir_id) {
|
||||||
hir::Node::Local(local) => Some(local),
|
hir::Node::LetStmt(local) => Some(local),
|
||||||
hir::Node::Pat(pattern) => get_parent_local_hir_id(cx, pattern.hir_id),
|
hir::Node::Pat(pattern) => get_parent_local_hir_id(cx, pattern.hir_id),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
|
|
|
@ -217,7 +217,7 @@ fn path_to_matched_type(cx: &LateContext<'_>, expr: &hir::Expr<'_>) -> Option<Ve
|
||||||
match peel_hir_expr_refs(expr).0.kind {
|
match peel_hir_expr_refs(expr).0.kind {
|
||||||
ExprKind::Path(ref qpath) => match cx.qpath_res(qpath, expr.hir_id) {
|
ExprKind::Path(ref qpath) => match cx.qpath_res(qpath, expr.hir_id) {
|
||||||
Res::Local(hir_id) => {
|
Res::Local(hir_id) => {
|
||||||
if let Node::Local(Local { init: Some(init), .. }) = cx.tcx.parent_hir_node(hir_id) {
|
if let Node::LetStmt(Local { init: Some(init), .. }) = cx.tcx.parent_hir_node(hir_id) {
|
||||||
path_to_matched_type(cx, init)
|
path_to_matched_type(cx, init)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
|
|
@ -63,7 +63,7 @@ impl<'tcx> LateLintPass<'tcx> for UselessVec {
|
||||||
match cx.tcx.parent_hir_node(expr.hir_id) {
|
match cx.tcx.parent_hir_node(expr.hir_id) {
|
||||||
// search for `let foo = vec![_]` expressions where all uses of `foo`
|
// search for `let foo = vec![_]` expressions where all uses of `foo`
|
||||||
// adjust to slices or call a method that exist on slices (e.g. len)
|
// adjust to slices or call a method that exist on slices (e.g. len)
|
||||||
Node::Local(LetStmt {
|
Node::LetStmt(LetStmt {
|
||||||
ty: None,
|
ty: None,
|
||||||
pat:
|
pat:
|
||||||
Pat {
|
Pat {
|
||||||
|
@ -93,7 +93,7 @@ impl<'tcx> LateLintPass<'tcx> for UselessVec {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// if the local pattern has a specified type, do not lint.
|
// if the local pattern has a specified type, do not lint.
|
||||||
Node::Local(LetStmt { ty: Some(_), .. }) if higher::VecArgs::hir(cx, expr).is_some() => {
|
Node::LetStmt(LetStmt { ty: Some(_), .. }) if higher::VecArgs::hir(cx, expr).is_some() => {
|
||||||
self.span_to_lint_map.insert(callsite, None);
|
self.span_to_lint_map.insert(callsite, None);
|
||||||
},
|
},
|
||||||
// search for `for _ in vec![...]`
|
// search for `for _ in vec![...]`
|
||||||
|
|
|
@ -78,7 +78,7 @@ fn inner_check(cx: &LateContext<'_>, expr: &'_ rustc_hir::Expr<'_>, inner_expr:
|
||||||
let parent_hir_node = cx.tcx.parent_hir_node(expr.hir_id);
|
let parent_hir_node = cx.tcx.parent_hir_node(expr.hir_id);
|
||||||
let return_type = cx.typeck_results().expr_ty(expr);
|
let return_type = cx.typeck_results().expr_ty(expr);
|
||||||
|
|
||||||
if let Node::Local(l) = parent_hir_node {
|
if let Node::LetStmt(l) = parent_hir_node {
|
||||||
array_span_lint(
|
array_span_lint(
|
||||||
cx,
|
cx,
|
||||||
l.span,
|
l.span,
|
||||||
|
|
|
@ -184,7 +184,7 @@ pub fn expr_or_init<'a, 'b, 'tcx: 'b>(cx: &LateContext<'tcx>, mut expr: &'a Expr
|
||||||
pub fn find_binding_init<'tcx>(cx: &LateContext<'tcx>, hir_id: HirId) -> Option<&'tcx Expr<'tcx>> {
|
pub fn find_binding_init<'tcx>(cx: &LateContext<'tcx>, hir_id: HirId) -> Option<&'tcx Expr<'tcx>> {
|
||||||
if let Node::Pat(pat) = cx.tcx.hir_node(hir_id)
|
if let Node::Pat(pat) = cx.tcx.hir_node(hir_id)
|
||||||
&& matches!(pat.kind, PatKind::Binding(BindingAnnotation::NONE, ..))
|
&& matches!(pat.kind, PatKind::Binding(BindingAnnotation::NONE, ..))
|
||||||
&& let Node::Local(local) = cx.tcx.parent_hir_node(hir_id)
|
&& let Node::LetStmt(local) = cx.tcx.parent_hir_node(hir_id)
|
||||||
{
|
{
|
||||||
return local.init;
|
return local.init;
|
||||||
}
|
}
|
||||||
|
@ -1079,7 +1079,7 @@ pub fn capture_local_usage(cx: &LateContext<'_>, e: &Expr<'_>) -> CaptureKind {
|
||||||
},
|
},
|
||||||
_ => break,
|
_ => break,
|
||||||
},
|
},
|
||||||
Node::Local(l) => match pat_capture_kind(cx, l.pat) {
|
Node::LetStmt(l) => match pat_capture_kind(cx, l.pat) {
|
||||||
CaptureKind::Value => break,
|
CaptureKind::Value => break,
|
||||||
capture @ CaptureKind::Ref(_) => return capture,
|
capture @ CaptureKind::Ref(_) => return capture,
|
||||||
},
|
},
|
||||||
|
@ -1357,7 +1357,7 @@ pub fn get_enclosing_loop_or_multi_call_closure<'tcx>(
|
||||||
ExprKind::Closure { .. } | ExprKind::Loop(..) => return Some(e),
|
ExprKind::Closure { .. } | ExprKind::Loop(..) => return Some(e),
|
||||||
_ => (),
|
_ => (),
|
||||||
},
|
},
|
||||||
Node::Stmt(_) | Node::Block(_) | Node::Local(_) | Node::Arm(_) => (),
|
Node::Stmt(_) | Node::Block(_) | Node::LetStmt(_) | Node::Arm(_) => (),
|
||||||
_ => break,
|
_ => break,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1462,7 +1462,7 @@ pub fn is_else_clause(tcx: TyCtxt<'_>, expr: &Expr<'_>) -> bool {
|
||||||
pub fn is_inside_let_else(tcx: TyCtxt<'_>, expr: &Expr<'_>) -> bool {
|
pub fn is_inside_let_else(tcx: TyCtxt<'_>, expr: &Expr<'_>) -> bool {
|
||||||
let mut child_id = expr.hir_id;
|
let mut child_id = expr.hir_id;
|
||||||
for (parent_id, node) in tcx.hir().parent_iter(child_id) {
|
for (parent_id, node) in tcx.hir().parent_iter(child_id) {
|
||||||
if let Node::Local(LetStmt {
|
if let Node::LetStmt(LetStmt {
|
||||||
init: Some(init),
|
init: Some(init),
|
||||||
els: Some(els),
|
els: Some(els),
|
||||||
..
|
..
|
||||||
|
@ -1482,7 +1482,7 @@ pub fn is_inside_let_else(tcx: TyCtxt<'_>, expr: &Expr<'_>) -> bool {
|
||||||
pub fn is_else_clause_in_let_else(tcx: TyCtxt<'_>, expr: &Expr<'_>) -> bool {
|
pub fn is_else_clause_in_let_else(tcx: TyCtxt<'_>, expr: &Expr<'_>) -> bool {
|
||||||
let mut child_id = expr.hir_id;
|
let mut child_id = expr.hir_id;
|
||||||
for (parent_id, node) in tcx.hir().parent_iter(child_id) {
|
for (parent_id, node) in tcx.hir().parent_iter(child_id) {
|
||||||
if let Node::Local(LetStmt { els: Some(els), .. }) = node
|
if let Node::LetStmt(LetStmt { els: Some(els), .. }) = node
|
||||||
&& els.hir_id == child_id
|
&& els.hir_id == child_id
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
@ -2639,7 +2639,7 @@ pub struct ExprUseCtxt<'tcx> {
|
||||||
/// The node which consumes a value.
|
/// The node which consumes a value.
|
||||||
pub enum ExprUseNode<'tcx> {
|
pub enum ExprUseNode<'tcx> {
|
||||||
/// Assignment to, or initializer for, a local
|
/// Assignment to, or initializer for, a local
|
||||||
Local(&'tcx LetStmt<'tcx>),
|
LetStmt(&'tcx LetStmt<'tcx>),
|
||||||
/// Initializer for a const or static item.
|
/// Initializer for a const or static item.
|
||||||
ConstStatic(OwnerId),
|
ConstStatic(OwnerId),
|
||||||
/// Implicit or explicit return from a function.
|
/// Implicit or explicit return from a function.
|
||||||
|
@ -2671,7 +2671,7 @@ impl<'tcx> ExprUseNode<'tcx> {
|
||||||
/// Gets the needed type as it's defined without any type inference.
|
/// Gets the needed type as it's defined without any type inference.
|
||||||
pub fn defined_ty(&self, cx: &LateContext<'tcx>) -> Option<DefinedTy<'tcx>> {
|
pub fn defined_ty(&self, cx: &LateContext<'tcx>) -> Option<DefinedTy<'tcx>> {
|
||||||
match *self {
|
match *self {
|
||||||
Self::Local(LetStmt { ty: Some(ty), .. }) => Some(DefinedTy::Hir(ty)),
|
Self::LetStmt(LetStmt { ty: Some(ty), .. }) => Some(DefinedTy::Hir(ty)),
|
||||||
Self::ConstStatic(id) => Some(DefinedTy::Mir(
|
Self::ConstStatic(id) => Some(DefinedTy::Mir(
|
||||||
cx.param_env
|
cx.param_env
|
||||||
.and(Binder::dummy(cx.tcx.type_of(id).instantiate_identity())),
|
.and(Binder::dummy(cx.tcx.type_of(id).instantiate_identity())),
|
||||||
|
@ -2731,7 +2731,7 @@ impl<'tcx> ExprUseNode<'tcx> {
|
||||||
let sig = cx.tcx.fn_sig(id).skip_binder();
|
let sig = cx.tcx.fn_sig(id).skip_binder();
|
||||||
Some(DefinedTy::Mir(cx.tcx.param_env(id).and(sig.input(i))))
|
Some(DefinedTy::Mir(cx.tcx.param_env(id).and(sig.input(i))))
|
||||||
},
|
},
|
||||||
Self::Local(_) | Self::FieldAccess(..) | Self::Callee | Self::Expr | Self::Other => None,
|
Self::LetStmt(_) | Self::FieldAccess(..) | Self::Callee | Self::Expr | Self::Other => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2770,7 +2770,7 @@ pub fn expr_use_ctxt<'tcx>(cx: &LateContext<'tcx>, e: &'tcx Expr<'tcx>) -> Optio
|
||||||
.continue_value()
|
.continue_value()
|
||||||
.map(|(use_node, child_id)| {
|
.map(|(use_node, child_id)| {
|
||||||
let node = match use_node {
|
let node = match use_node {
|
||||||
Node::Local(l) => ExprUseNode::Local(l),
|
Node::LetStmt(l) => ExprUseNode::LetStmt(l),
|
||||||
Node::ExprField(field) => ExprUseNode::Field(field),
|
Node::ExprField(field) => ExprUseNode::Field(field),
|
||||||
|
|
||||||
Node::Item(&Item {
|
Node::Item(&Item {
|
||||||
|
|
|
@ -242,7 +242,7 @@ fn path_segment_certainty(
|
||||||
Node::Param(..) => Certainty::Certain(None),
|
Node::Param(..) => Certainty::Certain(None),
|
||||||
// A local's type is certain if its type annotation is certain or it has an initializer whose
|
// A local's type is certain if its type annotation is certain or it has an initializer whose
|
||||||
// type is certain.
|
// type is certain.
|
||||||
Node::Local(local) => {
|
Node::LetStmt(local) => {
|
||||||
let lhs = local.ty.map_or(Certainty::Uncertain, |ty| type_certainty(cx, ty));
|
let lhs = local.ty.map_or(Certainty::Uncertain, |ty| type_certainty(cx, ty));
|
||||||
let rhs = local
|
let rhs = local
|
||||||
.init
|
.init
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue