summaryrefslogtreecommitdiffstats
path: root/src/tools/clippy/clippy_lints/src/methods/no_effect_replace.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/clippy/clippy_lints/src/methods/no_effect_replace.rs')
-rw-r--r--src/tools/clippy/clippy_lints/src/methods/no_effect_replace.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/tools/clippy/clippy_lints/src/methods/no_effect_replace.rs b/src/tools/clippy/clippy_lints/src/methods/no_effect_replace.rs
new file mode 100644
index 000000000..a76341855
--- /dev/null
+++ b/src/tools/clippy/clippy_lints/src/methods/no_effect_replace.rs
@@ -0,0 +1,47 @@
+use clippy_utils::diagnostics::span_lint;
+use clippy_utils::ty::is_type_diagnostic_item;
+use clippy_utils::SpanlessEq;
+use if_chain::if_chain;
+use rustc_ast::LitKind;
+use rustc_hir::ExprKind;
+use rustc_lint::LateContext;
+use rustc_span::sym;
+
+use super::NO_EFFECT_REPLACE;
+
+pub(super) fn check<'tcx>(
+ cx: &LateContext<'tcx>,
+ expr: &'tcx rustc_hir::Expr<'_>,
+ arg1: &'tcx rustc_hir::Expr<'_>,
+ arg2: &'tcx rustc_hir::Expr<'_>,
+) {
+ let ty = cx.typeck_results().expr_ty(expr).peel_refs();
+ if !(ty.is_str() || is_type_diagnostic_item(cx, ty, sym::String)) {
+ return;
+ }
+
+ if_chain! {
+ if let ExprKind::Lit(spanned) = &arg1.kind;
+ if let Some(param1) = lit_string_value(&spanned.node);
+
+ if let ExprKind::Lit(spanned) = &arg2.kind;
+ if let LitKind::Str(param2, _) = &spanned.node;
+ if param1 == param2.as_str();
+
+ then {
+ span_lint(cx, NO_EFFECT_REPLACE, expr.span, "replacing text with itself");
+ }
+ }
+
+ if SpanlessEq::new(cx).eq_expr(arg1, arg2) {
+ span_lint(cx, NO_EFFECT_REPLACE, expr.span, "replacing text with itself");
+ }
+}
+
+fn lit_string_value(node: &LitKind) -> Option<String> {
+ match node {
+ LitKind::Char(value) => Some(value.to_string()),
+ LitKind::Str(value, _) => Some(value.as_str().to_owned()),
+ _ => None,
+ }
+}