Rename has_nontrivial_oprand to is_operator_overrided

Simpfy code of `is_operator_overrided`, directly use `is_method_call` to
check
if operator is overrided, at least one oprand of binary-expr must be ADT-type
So no need to check type of lhs and rhs
This commit is contained in:
cocodery 2023-12-05 09:29:20 +08:00
parent 89774234be
commit 2e3c031528

View file

@ -10,7 +10,6 @@ use rustc_hir::{
use rustc_infer::infer::TyCtxtInferExt as _; use rustc_infer::infer::TyCtxtInferExt as _;
use rustc_lint::{LateContext, LateLintPass, LintContext}; use rustc_lint::{LateContext, LateLintPass, LintContext};
use rustc_middle::lint::in_external_macro; use rustc_middle::lint::in_external_macro;
use rustc_middle::ty;
use rustc_session::declare_lint_pass; use rustc_session::declare_lint_pass;
use std::ops::Deref; use std::ops::Deref;
@ -94,7 +93,7 @@ fn check_no_effect(cx: &LateContext<'_>, stmt: &Stmt<'_>) -> bool {
} }
let expr = peel_blocks(expr); let expr = peel_blocks(expr);
// assume nontrivial oprand of `Binary` Expr can skip `check_unnecessary_operation` // assume nontrivial oprand of `Binary` Expr can skip `check_unnecessary_operation`
if has_nontrivial_oprand(cx, expr) { if is_operator_overrided(cx, expr) {
return true; return true;
} }
if has_no_effect(cx, expr) { if has_no_effect(cx, expr) {
@ -163,31 +162,19 @@ fn check_no_effect(cx: &LateContext<'_>, stmt: &Stmt<'_>) -> bool {
false false
} }
fn has_nontrivial_oprand(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool { fn is_operator_overrided(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
// It's very hard or impossable to check whether overrided operator have side-effect this lint. // It's very hard or impossable to check whether overrided operator have side-effect this lint.
// So, this function assume user-defined binary operator is overrided with an side-effect. // So, this function assume user-defined binary operator is overrided with an side-effect.
// The definition of user-defined structure here is `struct`, `enum`, `uniom`, // The definition of user-defined structure here is ADT-type,
// Althrough this will weaken the ability of this lint, less error lint-fix happen. // Althrough this will weaken the ability of this lint, less error lint-fix happen.
match expr.kind { match expr.kind {
ExprKind::Binary(_, lhs, rhs) => { ExprKind::Binary(..) => {
// get type of lhs and rhs // No need to check type of `lhs` and `rhs`
let tyck_result = cx.typeck_results(); // because if the operator is overrided, at least one operand is ADT type
let ty_lhs = tyck_result.expr_ty(lhs).kind();
let ty_rhs = tyck_result.expr_ty(rhs).kind();
// check whether lhs is a user-defined structure
// only need to check lhs in fact
let ud_lhs = match ty_lhs {
ty::Adt(adt_def, _) => adt_def.is_struct() || adt_def.is_enum() || adt_def.is_union(),
_ => false,
};
let ud_rhs = match ty_rhs {
ty::Adt(adt_def, _) => adt_def.is_struct() || adt_def.is_enum() || adt_def.is_union(),
_ => false,
};
// reference: rust/compiler/rustc_middle/src/ty/typeck_results.rs: `is_method_call`. // reference: rust/compiler/rustc_middle/src/ty/typeck_results.rs: `is_method_call`.
// use this function to check whether operator is overrided in `ExprKind::Binary`. // use this function to check whether operator is overrided in `ExprKind::Binary`.
(ud_lhs || ud_rhs) && tyck_result.is_method_call(expr) cx.typeck_results().is_method_call(expr)
}, },
_ => false, _ => false,
} }