blob: 3fa041f97802abb7c9004e99ace579bbd9f900fd [file] [log] [blame] [edit]
use clippy_utils::sugg::Sugg;
use rustc_ast::ast;
use rustc_errors::Applicability;
use rustc_hir::{Expr, ExprKind, UnOp};
use rustc_lint::LateContext;
use rustc_middle::ty;
// Adds type suffixes and parenthesis to method receivers if necessary
pub(super) fn prepare_receiver_sugg<'a>(
cx: &LateContext<'_>,
mut expr: &'a Expr<'a>,
app: &mut Applicability,
) -> Sugg<'a> {
let mut suggestion = Sugg::hir_with_applicability(cx, expr, "_", app);
if let ExprKind::Unary(UnOp::Neg, inner_expr) = expr.kind {
expr = inner_expr;
}
if let ty::Float(float_ty) = cx.typeck_results().expr_ty(expr).kind()
// if the expression is a float literal and it is unsuffixed then
// add a suffix so the suggestion is valid and unambiguous
&& let ExprKind::Lit(lit) = expr.kind
&& let ast::LitKind::Float(sym, ast::LitFloatType::Unsuffixed) = lit.node
{
let op = format!(
"{suggestion}{}{}",
// Check for float literals without numbers following the decimal
// separator such as `2.` and adds a trailing zero
if sym.as_str().ends_with('.') { "0" } else { "" },
float_ty.name_str()
)
.into();
suggestion = match suggestion {
Sugg::MaybeParen(_) | Sugg::UnOp(UnOp::Neg, _) => Sugg::MaybeParen(op),
_ => Sugg::NonParen(op),
};
}
suggestion.maybe_paren()
}