Make LateCtxt be a type info delegate for EUV for clippy

This commit is contained in:
Michael Goulet 2024-05-08 14:08:18 -04:00
parent dfc9c9132b
commit db193c1c9d
9 changed files with 21 additions and 60 deletions

View File

@ -1,7 +1,6 @@
use clippy_utils::diagnostics::span_lint_hir; use clippy_utils::diagnostics::span_lint_hir;
use rustc_hir::{intravisit, AssocItemKind, Body, FnDecl, HirId, HirIdSet, Impl, ItemKind, Node, Pat, PatKind}; use rustc_hir::{intravisit, AssocItemKind, Body, FnDecl, HirId, HirIdSet, Impl, ItemKind, Node, Pat, PatKind};
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId}; use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
use rustc_infer::infer::TyCtxtInferExt;
use rustc_lint::{LateContext, LateLintPass}; use rustc_lint::{LateContext, LateLintPass};
use rustc_middle::mir::FakeReadCause; use rustc_middle::mir::FakeReadCause;
use rustc_middle::ty::layout::LayoutOf; use rustc_middle::ty::layout::LayoutOf;
@ -105,8 +104,7 @@ fn check_fn(
too_large_for_stack: self.too_large_for_stack, too_large_for_stack: self.too_large_for_stack,
}; };
let infcx = cx.tcx.infer_ctxt().build(); ExprUseVisitor::for_clippy(cx, fn_def_id, &mut v).consume_body(body);
ExprUseVisitor::new(&mut v, &infcx, fn_def_id, cx.param_env, cx.typeck_results()).consume_body(body);
for node in v.set { for node in v.set {
span_lint_hir( span_lint_hir(

View File

@ -4,7 +4,6 @@
use rustc_hir::intravisit::{self, Visitor}; use rustc_hir::intravisit::{self, Visitor};
use rustc_hir::{BindingMode, Expr, ExprKind, HirId, Node, PatKind}; use rustc_hir::{BindingMode, Expr, ExprKind, HirId, Node, PatKind};
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId}; use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
use rustc_infer::infer::TyCtxtInferExt;
use rustc_lint::LateContext; use rustc_lint::LateContext;
use rustc_middle::mir::FakeReadCause; use rustc_middle::mir::FakeReadCause;
use rustc_middle::ty; use rustc_middle::ty;
@ -61,13 +60,10 @@ fn check_for_mutation(
span_low: None, span_low: None,
span_high: None, span_high: None,
}; };
let infcx = cx.tcx.infer_ctxt().build(); ExprUseVisitor::for_clippy(
ExprUseVisitor::new( cx,
&mut delegate,
&infcx,
body.hir_id.owner.def_id, body.hir_id.owner.def_id,
cx.param_env, &mut delegate,
cx.typeck_results(),
) )
.walk_expr(body); .walk_expr(body);

View File

@ -69,14 +69,11 @@ pub(super) fn check<'tcx>(
let mut delegate = MoveDelegate { let mut delegate = MoveDelegate {
used_move: HirIdSet::default(), used_move: HirIdSet::default(),
}; };
let infcx = cx.tcx.infer_ctxt().build();
ExprUseVisitor::new( ExprUseVisitor::for_clippy(
cx,
closure.def_id,
&mut delegate, &mut delegate,
&infcx,
closure.body.hir_id.owner.def_id,
cx.param_env,
cx.typeck_results(),
) )
.consume_body(body); .consume_body(body);

View File

@ -11,7 +11,6 @@
PatKind, PatKind,
}; };
use rustc_hir_typeck::expr_use_visitor as euv; use rustc_hir_typeck::expr_use_visitor as euv;
use rustc_infer::infer::{InferCtxt, TyCtxtInferExt};
use rustc_lint::{LateContext, LateLintPass}; use rustc_lint::{LateContext, LateLintPass};
use rustc_middle::mir::FakeReadCause; use rustc_middle::mir::FakeReadCause;
use rustc_middle::ty::{self, Ty, TyCtxt, UpvarId, UpvarPath}; use rustc_middle::ty::{self, Ty, TyCtxt, UpvarId, UpvarPath};
@ -102,7 +101,6 @@ fn should_skip<'tcx>(
fn check_closures<'tcx>( fn check_closures<'tcx>(
ctx: &mut MutablyUsedVariablesCtxt<'tcx>, ctx: &mut MutablyUsedVariablesCtxt<'tcx>,
cx: &LateContext<'tcx>, cx: &LateContext<'tcx>,
infcx: &InferCtxt<'tcx>,
checked_closures: &mut FxHashSet<LocalDefId>, checked_closures: &mut FxHashSet<LocalDefId>,
closures: FxHashSet<LocalDefId>, closures: FxHashSet<LocalDefId>,
) { ) {
@ -119,7 +117,7 @@ fn check_closures<'tcx>(
.associated_body() .associated_body()
.map(|(_, body_id)| hir.body(body_id)) .map(|(_, body_id)| hir.body(body_id))
{ {
euv::ExprUseVisitor::new(ctx, infcx, closure, cx.param_env, cx.typeck_results()).consume_body(body); euv::ExprUseVisitor::for_clippy(cx, closure, &mut *ctx).consume_body(body);
} }
} }
} }
@ -196,8 +194,7 @@ fn check_fn(
async_closures: FxHashSet::default(), async_closures: FxHashSet::default(),
tcx: cx.tcx, tcx: cx.tcx,
}; };
let infcx = cx.tcx.infer_ctxt().build(); euv::ExprUseVisitor::for_clippy(cx, fn_def_id, &mut ctx).consume_body(body);
euv::ExprUseVisitor::new(&mut ctx, &infcx, fn_def_id, cx.param_env, cx.typeck_results()).consume_body(body);
let mut checked_closures = FxHashSet::default(); let mut checked_closures = FxHashSet::default();
@ -210,13 +207,13 @@ fn check_fn(
} }
ControlFlow::<()>::Continue(()) ControlFlow::<()>::Continue(())
}); });
check_closures(&mut ctx, cx, &infcx, &mut checked_closures, closures); check_closures(&mut ctx, cx, &mut checked_closures, closures);
if is_async { if is_async {
while !ctx.async_closures.is_empty() { while !ctx.async_closures.is_empty() {
let async_closures = ctx.async_closures.clone(); let async_closures = ctx.async_closures.clone();
ctx.async_closures.clear(); ctx.async_closures.clear();
check_closures(&mut ctx, cx, &infcx, &mut checked_closures, async_closures); check_closures(&mut ctx, cx, &mut checked_closures, async_closures);
} }
} }
ctx.generate_mutably_used_ids_from_aliases() ctx.generate_mutably_used_ids_from_aliases()

View File

@ -13,7 +13,6 @@
TyKind, TyKind,
}; };
use rustc_hir_typeck::expr_use_visitor as euv; use rustc_hir_typeck::expr_use_visitor as euv;
use rustc_infer::infer::TyCtxtInferExt;
use rustc_lint::{LateContext, LateLintPass}; use rustc_lint::{LateContext, LateLintPass};
use rustc_middle::mir::FakeReadCause; use rustc_middle::mir::FakeReadCause;
use rustc_middle::ty::{self, Ty, TypeVisitableExt}; use rustc_middle::ty::{self, Ty, TypeVisitableExt};
@ -134,8 +133,7 @@ fn check_fn(
// function body. // function body.
let MovedVariablesCtxt { moved_vars } = { let MovedVariablesCtxt { moved_vars } = {
let mut ctx = MovedVariablesCtxt::default(); let mut ctx = MovedVariablesCtxt::default();
let infcx = cx.tcx.infer_ctxt().build(); euv::ExprUseVisitor::for_clippy(cx, fn_def_id, &mut ctx).consume_body(body);
euv::ExprUseVisitor::new(&mut ctx, &infcx, fn_def_id, cx.param_env, cx.typeck_results()).consume_body(body);
ctx ctx
}; };

View File

@ -11,7 +11,6 @@
use rustc_lint::LateContext; use rustc_lint::LateContext;
use rustc_middle::mir::FakeReadCause; use rustc_middle::mir::FakeReadCause;
use rustc_middle::ty::BorrowKind; use rustc_middle::ty::BorrowKind;
use rustc_trait_selection::infer::TyCtxtInferExt;
use super::ASSIGN_OP_PATTERN; use super::ASSIGN_OP_PATTERN;
@ -119,14 +118,7 @@ fn copy(&mut self, _: &PlaceWithHirId<'_>, _: HirId) {}
} }
let mut s = S(HirIdSet::default()); let mut s = S(HirIdSet::default());
let infcx = cx.tcx.infer_ctxt().build(); let v = ExprUseVisitor::for_clippy(cx, e.hir_id.owner.def_id, &mut s);
let v = ExprUseVisitor::new(
&mut s,
&infcx,
cx.tcx.hir().body_owner_def_id(cx.enclosing_body.unwrap()),
cx.param_env,
cx.typeck_results(),
);
v.consume_expr(e); v.consume_expr(e);
s.0 s.0
} }
@ -151,14 +143,7 @@ fn copy(&mut self, _: &PlaceWithHirId<'_>, _: HirId) {}
} }
let mut s = S(HirIdSet::default()); let mut s = S(HirIdSet::default());
let infcx = cx.tcx.infer_ctxt().build(); let v = ExprUseVisitor::for_clippy(cx, e.hir_id.owner.def_id, &mut s);
let v = ExprUseVisitor::new(
&mut s,
&infcx,
cx.tcx.hir().body_owner_def_id(cx.enclosing_body.unwrap()),
cx.param_env,
cx.typeck_results(),
);
v.consume_expr(e); v.consume_expr(e);
s.0 s.0
} }

View File

@ -6,7 +6,6 @@
use rustc_hir::intravisit::{walk_expr, walk_fn, FnKind, Visitor}; use rustc_hir::intravisit::{walk_expr, walk_fn, FnKind, Visitor};
use rustc_hir::{BinOpKind, Body, Expr, ExprKind, FnDecl, HirId, Node, PathSegment, UnOp}; use rustc_hir::{BinOpKind, Body, Expr, ExprKind, FnDecl, HirId, Node, PathSegment, UnOp};
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceWithHirId}; use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceWithHirId};
use rustc_infer::infer::TyCtxtInferExt;
use rustc_lint::{LateContext, LateLintPass}; use rustc_lint::{LateContext, LateLintPass};
use rustc_middle::hir::nested_filter; use rustc_middle::hir::nested_filter;
use rustc_middle::lint::in_external_macro; use rustc_middle::lint::in_external_macro;
@ -252,13 +251,10 @@ fn visit_branch(
local_id: unwrap_info.local_id, local_id: unwrap_info.local_id,
}; };
let infcx = self.cx.tcx.infer_ctxt().build(); let vis = ExprUseVisitor::for_clippy(
let vis = ExprUseVisitor::new( self.cx,
&mut delegate,
&infcx,
cond.hir_id.owner.def_id, cond.hir_id.owner.def_id,
self.cx.param_env, &mut delegate,
self.cx.typeck_results(),
); );
vis.walk_expr(cond); vis.walk_expr(cond);
vis.walk_expr(branch); vis.walk_expr(branch);

View File

@ -11,7 +11,6 @@
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::{Closure, ExprKind, HirId, MutTy, TyKind}; use rustc_hir::{Closure, ExprKind, HirId, MutTy, TyKind};
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId}; use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
use rustc_infer::infer::TyCtxtInferExt;
use rustc_lint::{EarlyContext, LateContext, LintContext}; use rustc_lint::{EarlyContext, LateContext, LintContext};
use rustc_middle::hir::place::ProjectionKind; use rustc_middle::hir::place::ProjectionKind;
use rustc_middle::mir::{FakeReadCause, Mutability}; use rustc_middle::mir::{FakeReadCause, Mutability};
@ -831,8 +830,7 @@ pub fn deref_closure_args(cx: &LateContext<'_>, closure: &hir::Expr<'_>) -> Opti
applicability: Applicability::MachineApplicable, applicability: Applicability::MachineApplicable,
}; };
let infcx = cx.tcx.infer_ctxt().build(); ExprUseVisitor::for_clippy(cx, def_id, &mut visitor).consume_body(closure_body);
ExprUseVisitor::new(&mut visitor, &infcx, def_id, cx.param_env, cx.typeck_results()).consume_body(closure_body);
if !visitor.suggestion_start.is_empty() { if !visitor.suggestion_start.is_empty() {
return Some(DerefClosure { return Some(DerefClosure {

View File

@ -5,7 +5,6 @@
use rustc_hir::intravisit::{self, Visitor}; use rustc_hir::intravisit::{self, Visitor};
use rustc_hir::{self as hir, Expr, ExprKind, HirId, HirIdSet}; use rustc_hir::{self as hir, Expr, ExprKind, HirId, HirIdSet};
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, Place, PlaceBase, PlaceWithHirId}; use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, Place, PlaceBase, PlaceWithHirId};
use rustc_infer::infer::TyCtxtInferExt;
use rustc_lint::LateContext; use rustc_lint::LateContext;
use rustc_middle::hir::nested_filter; use rustc_middle::hir::nested_filter;
use rustc_middle::mir::FakeReadCause; use rustc_middle::mir::FakeReadCause;
@ -17,13 +16,10 @@ pub fn mutated_variables<'tcx>(expr: &'tcx Expr<'_>, cx: &LateContext<'tcx>) ->
used_mutably: HirIdSet::default(), used_mutably: HirIdSet::default(),
skip: false, skip: false,
}; };
let infcx = cx.tcx.infer_ctxt().build(); ExprUseVisitor::for_clippy(
ExprUseVisitor::new( cx,
&mut delegate,
&infcx,
expr.hir_id.owner.def_id, expr.hir_id.owner.def_id,
cx.param_env, &mut delegate,
cx.typeck_results(),
) )
.walk_expr(expr); .walk_expr(expr);