Skip to content

Commit 55cf09d

Browse files
Make LateCtxt be a type info delegate for EUV for clippy
1 parent e4209f1 commit 55cf09d

File tree

10 files changed

+59
-61
lines changed

10 files changed

+59
-61
lines changed

Diff for: compiler/rustc_hir_typeck/src/expr_use_visitor.rs

+38-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use std::slice::from_ref;
99
use hir::def::DefKind;
1010
use hir::pat_util::EnumerateAndAdjustIterator as _;
1111
use hir::Expr;
12+
use rustc_lint::LateContext;
1213
// Export these here so that Clippy can use them.
1314
pub use rustc_middle::hir::place::{Place, PlaceBase, PlaceWithHirId, Projection};
1415

@@ -172,6 +173,36 @@ impl<'tcx> TypeInformationCtxt<'tcx> for &FnCtxt<'_, 'tcx> {
172173
}
173174
}
174175

176+
impl<'tcx> TypeInformationCtxt<'tcx> for (&LateContext<'tcx>, LocalDefId) {
177+
type TypeckResults<'a> = &'tcx ty::TypeckResults<'tcx>
178+
where
179+
Self: 'a;
180+
181+
fn typeck_results(&self) -> Self::TypeckResults<'_> {
182+
self.0.maybe_typeck_results().expect("expected typeck results")
183+
}
184+
185+
fn resolve_vars_if_possible<T: TypeFoldable<TyCtxt<'tcx>>>(&self, t: T) -> T {
186+
t
187+
}
188+
189+
fn tainted_by_errors(&self) -> Option<ErrorGuaranteed> {
190+
None
191+
}
192+
193+
fn type_is_copy_modulo_regions(&self, ty: Ty<'tcx>) -> bool {
194+
ty.is_copy_modulo_regions(self.0.tcx, self.0.param_env)
195+
}
196+
197+
fn body_owner_def_id(&self) -> LocalDefId {
198+
self.1
199+
}
200+
201+
fn tcx(&self) -> TyCtxt<'tcx> {
202+
self.0.tcx
203+
}
204+
}
205+
175206
/// The ExprUseVisitor type
176207
///
177208
/// This is the code that actually walks the tree.
@@ -200,13 +231,19 @@ macro_rules! return_if_err {
200231
};
201232
}
202233

234+
impl<'a, 'tcx, D: Delegate<'tcx>> ExprUseVisitor<'tcx, (&'a LateContext<'tcx>, LocalDefId), D> {
235+
pub fn for_clippy(cx: &'a LateContext<'tcx>, body_def_id: LocalDefId, delegate: D) -> Self {
236+
Self::new((cx, body_def_id), delegate)
237+
}
238+
}
239+
203240
impl<'tcx, Cx: TypeInformationCtxt<'tcx>, D: Delegate<'tcx>> ExprUseVisitor<'tcx, Cx, D> {
204241
/// Creates the ExprUseVisitor, configuring it with the various options provided:
205242
///
206243
/// - `delegate` -- who receives the callbacks
207244
/// - `param_env` --- parameter environment for trait lookups (esp. pertaining to `Copy`)
208245
/// - `typeck_results` --- typeck results for the code being analyzed
209-
pub fn new(cx: Cx, delegate: D) -> Self {
246+
pub(crate) fn new(cx: Cx, delegate: D) -> Self {
210247
ExprUseVisitor {
211248
delegate: RefCell::new(delegate),
212249
upvars: cx.tcx().upvars_mentioned(cx.body_owner_def_id()),

Diff for: src/tools/clippy/clippy_lints/src/escape.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use clippy_utils::diagnostics::span_lint_hir;
22
use rustc_hir::{intravisit, AssocItemKind, Body, FnDecl, HirId, HirIdSet, Impl, ItemKind, Node, Pat, PatKind};
33
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
4-
use rustc_infer::infer::TyCtxtInferExt;
54
use rustc_lint::{LateContext, LateLintPass};
65
use rustc_middle::mir::FakeReadCause;
76
use rustc_middle::ty::layout::LayoutOf;
@@ -105,8 +104,7 @@ impl<'tcx> LateLintPass<'tcx> for BoxedLocal {
105104
too_large_for_stack: self.too_large_for_stack,
106105
};
107106

108-
let infcx = cx.tcx.infer_ctxt().build();
109-
ExprUseVisitor::new(&mut v, &infcx, fn_def_id, cx.param_env, cx.typeck_results()).consume_body(body);
107+
ExprUseVisitor::for_clippy(cx, fn_def_id, &mut v).consume_body(body);
110108

111109
for node in v.set {
112110
span_lint_hir(

Diff for: src/tools/clippy/clippy_lints/src/loops/mut_range_bound.rs

+3-7
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use clippy_utils::{get_enclosing_block, higher, path_to_local};
44
use rustc_hir::intravisit::{self, Visitor};
55
use rustc_hir::{BindingMode, Expr, ExprKind, HirId, Node, PatKind};
66
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
7-
use rustc_infer::infer::TyCtxtInferExt;
87
use rustc_lint::LateContext;
98
use rustc_middle::mir::FakeReadCause;
109
use rustc_middle::ty;
@@ -61,13 +60,10 @@ fn check_for_mutation(
6160
span_low: None,
6261
span_high: None,
6362
};
64-
let infcx = cx.tcx.infer_ctxt().build();
65-
ExprUseVisitor::new(
66-
&mut delegate,
67-
&infcx,
63+
ExprUseVisitor::for_clippy(
64+
cx,
6865
body.hir_id.owner.def_id,
69-
cx.param_env,
70-
cx.typeck_results(),
66+
&mut delegate,
7167
)
7268
.walk_expr(body);
7369

Diff for: src/tools/clippy/clippy_lints/src/methods/iter_overeager_cloned.rs

+3-6
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,11 @@ pub(super) fn check<'tcx>(
6969
let mut delegate = MoveDelegate {
7070
used_move: HirIdSet::default(),
7171
};
72-
let infcx = cx.tcx.infer_ctxt().build();
7372

74-
ExprUseVisitor::new(
73+
ExprUseVisitor::for_clippy(
74+
cx,
75+
closure.def_id,
7576
&mut delegate,
76-
&infcx,
77-
closure.body.hir_id.owner.def_id,
78-
cx.param_env,
79-
cx.typeck_results(),
8077
)
8178
.consume_body(body);
8279

Diff for: src/tools/clippy/clippy_lints/src/needless_pass_by_ref_mut.rs

+4-7
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use rustc_hir::{
1111
PatKind,
1212
};
1313
use rustc_hir_typeck::expr_use_visitor as euv;
14-
use rustc_infer::infer::{InferCtxt, TyCtxtInferExt};
1514
use rustc_lint::{LateContext, LateLintPass};
1615
use rustc_middle::mir::FakeReadCause;
1716
use rustc_middle::ty::{self, Ty, TyCtxt, UpvarId, UpvarPath};
@@ -102,7 +101,6 @@ fn should_skip<'tcx>(
102101
fn check_closures<'tcx>(
103102
ctx: &mut MutablyUsedVariablesCtxt<'tcx>,
104103
cx: &LateContext<'tcx>,
105-
infcx: &InferCtxt<'tcx>,
106104
checked_closures: &mut FxHashSet<LocalDefId>,
107105
closures: FxHashSet<LocalDefId>,
108106
) {
@@ -119,7 +117,7 @@ fn check_closures<'tcx>(
119117
.associated_body()
120118
.map(|(_, body_id)| hir.body(body_id))
121119
{
122-
euv::ExprUseVisitor::new(ctx, infcx, closure, cx.param_env, cx.typeck_results()).consume_body(body);
120+
euv::ExprUseVisitor::for_clippy(cx, closure, &mut *ctx).consume_body(body);
123121
}
124122
}
125123
}
@@ -196,8 +194,7 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByRefMut<'tcx> {
196194
async_closures: FxHashSet::default(),
197195
tcx: cx.tcx,
198196
};
199-
let infcx = cx.tcx.infer_ctxt().build();
200-
euv::ExprUseVisitor::new(&mut ctx, &infcx, fn_def_id, cx.param_env, cx.typeck_results()).consume_body(body);
197+
euv::ExprUseVisitor::for_clippy(cx, fn_def_id, &mut ctx).consume_body(body);
201198

202199
let mut checked_closures = FxHashSet::default();
203200

@@ -210,13 +207,13 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByRefMut<'tcx> {
210207
}
211208
ControlFlow::<()>::Continue(())
212209
});
213-
check_closures(&mut ctx, cx, &infcx, &mut checked_closures, closures);
210+
check_closures(&mut ctx, cx, &mut checked_closures, closures);
214211

215212
if is_async {
216213
while !ctx.async_closures.is_empty() {
217214
let async_closures = ctx.async_closures.clone();
218215
ctx.async_closures.clear();
219-
check_closures(&mut ctx, cx, &infcx, &mut checked_closures, async_closures);
216+
check_closures(&mut ctx, cx, &mut checked_closures, async_closures);
220217
}
221218
}
222219
ctx.generate_mutably_used_ids_from_aliases()

Diff for: src/tools/clippy/clippy_lints/src/needless_pass_by_value.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use rustc_hir::{
1313
TyKind,
1414
};
1515
use rustc_hir_typeck::expr_use_visitor as euv;
16-
use rustc_infer::infer::TyCtxtInferExt;
1716
use rustc_lint::{LateContext, LateLintPass};
1817
use rustc_middle::mir::FakeReadCause;
1918
use rustc_middle::ty::{self, Ty, TypeVisitableExt};
@@ -134,8 +133,7 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByValue {
134133
// function body.
135134
let MovedVariablesCtxt { moved_vars } = {
136135
let mut ctx = MovedVariablesCtxt::default();
137-
let infcx = cx.tcx.infer_ctxt().build();
138-
euv::ExprUseVisitor::new(&mut ctx, &infcx, fn_def_id, cx.param_env, cx.typeck_results()).consume_body(body);
136+
euv::ExprUseVisitor::for_clippy(cx, fn_def_id, &mut ctx).consume_body(body);
139137
ctx
140138
};
141139

Diff for: src/tools/clippy/clippy_lints/src/operators/assign_op_pattern.rs

+2-17
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, Pl
1111
use rustc_lint::LateContext;
1212
use rustc_middle::mir::FakeReadCause;
1313
use rustc_middle::ty::BorrowKind;
14-
use rustc_trait_selection::infer::TyCtxtInferExt;
1514

1615
use super::ASSIGN_OP_PATTERN;
1716

@@ -119,14 +118,7 @@ fn imm_borrows_in_expr(cx: &LateContext<'_>, e: &hir::Expr<'_>) -> HirIdSet {
119118
}
120119

121120
let mut s = S(HirIdSet::default());
122-
let infcx = cx.tcx.infer_ctxt().build();
123-
let v = ExprUseVisitor::new(
124-
&mut s,
125-
&infcx,
126-
cx.tcx.hir().body_owner_def_id(cx.enclosing_body.unwrap()),
127-
cx.param_env,
128-
cx.typeck_results(),
129-
);
121+
let v = ExprUseVisitor::for_clippy(cx, e.hir_id.owner.def_id, &mut s);
130122
v.consume_expr(e);
131123
s.0
132124
}
@@ -151,14 +143,7 @@ fn mut_borrows_in_expr(cx: &LateContext<'_>, e: &hir::Expr<'_>) -> HirIdSet {
151143
}
152144

153145
let mut s = S(HirIdSet::default());
154-
let infcx = cx.tcx.infer_ctxt().build();
155-
let v = ExprUseVisitor::new(
156-
&mut s,
157-
&infcx,
158-
cx.tcx.hir().body_owner_def_id(cx.enclosing_body.unwrap()),
159-
cx.param_env,
160-
cx.typeck_results(),
161-
);
146+
let v = ExprUseVisitor::for_clippy(cx, e.hir_id.owner.def_id, &mut s);
162147
v.consume_expr(e);
163148
s.0
164149
}

Diff for: src/tools/clippy/clippy_lints/src/unwrap.rs

+3-7
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use rustc_errors::Applicability;
66
use rustc_hir::intravisit::{walk_expr, walk_fn, FnKind, Visitor};
77
use rustc_hir::{BinOpKind, Body, Expr, ExprKind, FnDecl, HirId, Node, PathSegment, UnOp};
88
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceWithHirId};
9-
use rustc_infer::infer::TyCtxtInferExt;
109
use rustc_lint::{LateContext, LateLintPass};
1110
use rustc_middle::hir::nested_filter;
1211
use rustc_middle::lint::in_external_macro;
@@ -252,13 +251,10 @@ impl<'a, 'tcx> UnwrappableVariablesVisitor<'a, 'tcx> {
252251
local_id: unwrap_info.local_id,
253252
};
254253

255-
let infcx = self.cx.tcx.infer_ctxt().build();
256-
let vis = ExprUseVisitor::new(
257-
&mut delegate,
258-
&infcx,
254+
let vis = ExprUseVisitor::for_clippy(
255+
self.cx,
259256
cond.hir_id.owner.def_id,
260-
self.cx.param_env,
261-
self.cx.typeck_results(),
257+
&mut delegate,
262258
);
263259
vis.walk_expr(cond);
264260
vis.walk_expr(branch);

Diff for: src/tools/clippy/clippy_utils/src/sugg.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use rustc_errors::Applicability;
1111
use rustc_hir as hir;
1212
use rustc_hir::{Closure, ExprKind, HirId, MutTy, TyKind};
1313
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
14-
use rustc_infer::infer::TyCtxtInferExt;
1514
use rustc_lint::{EarlyContext, LateContext, LintContext};
1615
use rustc_middle::hir::place::ProjectionKind;
1716
use rustc_middle::mir::{FakeReadCause, Mutability};
@@ -831,8 +830,7 @@ pub fn deref_closure_args(cx: &LateContext<'_>, closure: &hir::Expr<'_>) -> Opti
831830
applicability: Applicability::MachineApplicable,
832831
};
833832

834-
let infcx = cx.tcx.infer_ctxt().build();
835-
ExprUseVisitor::new(&mut visitor, &infcx, def_id, cx.param_env, cx.typeck_results()).consume_body(closure_body);
833+
ExprUseVisitor::for_clippy(cx, def_id, &mut visitor).consume_body(closure_body);
836834

837835
if !visitor.suggestion_start.is_empty() {
838836
return Some(DerefClosure {

Diff for: src/tools/clippy/clippy_utils/src/usage.rs

+3-7
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use hir::def::Res;
55
use rustc_hir::intravisit::{self, Visitor};
66
use rustc_hir::{self as hir, Expr, ExprKind, HirId, HirIdSet};
77
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, Place, PlaceBase, PlaceWithHirId};
8-
use rustc_infer::infer::TyCtxtInferExt;
98
use rustc_lint::LateContext;
109
use rustc_middle::hir::nested_filter;
1110
use rustc_middle::mir::FakeReadCause;
@@ -17,13 +16,10 @@ pub fn mutated_variables<'tcx>(expr: &'tcx Expr<'_>, cx: &LateContext<'tcx>) ->
1716
used_mutably: HirIdSet::default(),
1817
skip: false,
1918
};
20-
let infcx = cx.tcx.infer_ctxt().build();
21-
ExprUseVisitor::new(
22-
&mut delegate,
23-
&infcx,
19+
ExprUseVisitor::for_clippy(
20+
cx,
2421
expr.hir_id.owner.def_id,
25-
cx.param_env,
26-
cx.typeck_results(),
22+
&mut delegate,
2723
)
2824
.walk_expr(expr);
2925

0 commit comments

Comments
 (0)