Add clippy like expr_or_init fn to rustc LateContext
This commit is contained in:
parent
cc7a9d6972
commit
6192690b92
1 changed files with 48 additions and 0 deletions
|
@ -1315,6 +1315,54 @@ impl<'tcx> LateContext<'tcx> {
|
||||||
tcx.try_normalize_erasing_regions(self.param_env, proj).ok()
|
tcx.try_normalize_erasing_regions(self.param_env, proj).ok()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// If the given expression is a local binding, find the initializer expression.
|
||||||
|
/// If that initializer expression is another local or **outside** (`const`/`static`)
|
||||||
|
/// binding, find its initializer again.
|
||||||
|
///
|
||||||
|
/// This process repeats as long as possible (but usually no more than once).
|
||||||
|
/// Type-check adjustments are not taken in account in this function.
|
||||||
|
///
|
||||||
|
/// Examples:
|
||||||
|
/// ```
|
||||||
|
/// const ABC: i32 = 1;
|
||||||
|
/// // ^ output
|
||||||
|
/// let def = ABC;
|
||||||
|
/// dbg!(def);
|
||||||
|
/// // ^^^ input
|
||||||
|
///
|
||||||
|
/// // or...
|
||||||
|
/// let abc = 1;
|
||||||
|
/// let def = abc + 2;
|
||||||
|
/// // ^^^^^^^ output
|
||||||
|
/// dbg!(def);
|
||||||
|
/// // ^^^ input
|
||||||
|
/// ```
|
||||||
|
pub fn expr_or_init<'a>(&self, mut expr: &'a hir::Expr<'tcx>) -> &'a hir::Expr<'tcx> {
|
||||||
|
expr = expr.peel_blocks();
|
||||||
|
|
||||||
|
while let hir::ExprKind::Path(ref qpath) = expr.kind
|
||||||
|
&& let Some(parent_node) = match self.qpath_res(qpath, expr.hir_id) {
|
||||||
|
Res::Local(hir_id) => self.tcx.hir().find_parent(hir_id),
|
||||||
|
Res::Def(_, def_id) => self.tcx.hir().get_if_local(def_id),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
&& let Some(init) = match parent_node {
|
||||||
|
hir::Node::Expr(expr) => Some(expr),
|
||||||
|
hir::Node::Local(hir::Local { init, .. }) => *init,
|
||||||
|
hir::Node::Item(item) => match item.kind {
|
||||||
|
hir::ItemKind::Const(.., body_id) | hir::ItemKind::Static(.., body_id) => {
|
||||||
|
Some(self.tcx.hir().body(body_id).value)
|
||||||
|
}
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
{
|
||||||
|
expr = init.peel_blocks();
|
||||||
|
}
|
||||||
|
expr
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> abi::HasDataLayout for LateContext<'tcx> {
|
impl<'tcx> abi::HasDataLayout for LateContext<'tcx> {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue