do not use stringly typed diagnostics
This commit is contained in:
parent
1e36f7e9ae
commit
1caed51673
3 changed files with 31 additions and 26 deletions
|
@ -478,13 +478,11 @@ lint_requested_level = requested on the command line with `{$level} {$lint_name}
|
||||||
lint_supertrait_as_deref_target = `{$t}` implements `Deref` with supertrait `{$target_principal}` as target
|
lint_supertrait_as_deref_target = `{$t}` implements `Deref` with supertrait `{$target_principal}` as target
|
||||||
.label = target type is set here
|
.label = target type is set here
|
||||||
|
|
||||||
lint_suspicious_double_ref_op =
|
lint_suspicious_double_ref_clone =
|
||||||
using `.{$call}()` on a double reference, which returns `{$ty}` instead of {$op ->
|
using `.clone()` on a double reference, which returns `{$ty}` instead of cloning the inner type
|
||||||
*[should_not_happen] [{$op}]
|
|
||||||
[deref] dereferencing
|
lint_suspicious_double_ref_deref =
|
||||||
[borrow] borrowing
|
using `.deref()` on a double reference, which returns `{$ty}` instead of dereferencing the inner type
|
||||||
[clone] cloning
|
|
||||||
} the inner type
|
|
||||||
|
|
||||||
lint_trivial_untranslatable_diag = diagnostic with static strings only
|
lint_trivial_untranslatable_diag = diagnostic with static strings only
|
||||||
|
|
||||||
|
|
|
@ -1231,11 +1231,15 @@ pub struct NoopMethodCallDiag<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(LintDiagnostic)]
|
#[derive(LintDiagnostic)]
|
||||||
#[diag(lint_suspicious_double_ref_op)]
|
#[diag(lint_suspicious_double_ref_deref)]
|
||||||
pub struct SuspiciousDoubleRefDiag<'a> {
|
pub struct SuspiciousDoubleRefDerefDiag<'a> {
|
||||||
pub call: Symbol,
|
pub ty: Ty<'a>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(LintDiagnostic)]
|
||||||
|
#[diag(lint_suspicious_double_ref_clone)]
|
||||||
|
pub struct SuspiciousDoubleRefCloneDiag<'a> {
|
||||||
pub ty: Ty<'a>,
|
pub ty: Ty<'a>,
|
||||||
pub op: &'static str,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// pass_by_value.rs
|
// pass_by_value.rs
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
use crate::context::LintContext;
|
use crate::context::LintContext;
|
||||||
use crate::lints::{NoopMethodCallDiag, SuspiciousDoubleRefDiag};
|
use crate::lints::{
|
||||||
|
NoopMethodCallDiag, SuspiciousDoubleRefCloneDiag, SuspiciousDoubleRefDerefDiag,
|
||||||
|
};
|
||||||
use crate::LateContext;
|
use crate::LateContext;
|
||||||
use crate::LateLintPass;
|
use crate::LateLintPass;
|
||||||
use rustc_hir::def::DefKind;
|
use rustc_hir::def::DefKind;
|
||||||
|
@ -102,13 +104,6 @@ impl<'tcx> LateLintPass<'tcx> for NoopMethodCall {
|
||||||
// (Re)check that it implements the noop diagnostic.
|
// (Re)check that it implements the noop diagnostic.
|
||||||
let Some(name) = cx.tcx.get_diagnostic_name(i.def_id()) else { return };
|
let Some(name) = cx.tcx.get_diagnostic_name(i.def_id()) else { return };
|
||||||
|
|
||||||
let op = match name {
|
|
||||||
sym::noop_method_borrow => "borrow",
|
|
||||||
sym::noop_method_clone => "clone",
|
|
||||||
sym::noop_method_deref => "deref",
|
|
||||||
_ => return,
|
|
||||||
};
|
|
||||||
|
|
||||||
let receiver_ty = cx.typeck_results().expr_ty(receiver);
|
let receiver_ty = cx.typeck_results().expr_ty(receiver);
|
||||||
let expr_ty = cx.typeck_results().expr_ty_adjusted(expr);
|
let expr_ty = cx.typeck_results().expr_ty_adjusted(expr);
|
||||||
let arg_adjustments = cx.typeck_results().expr_adjustments(receiver);
|
let arg_adjustments = cx.typeck_results().expr_adjustments(receiver);
|
||||||
|
@ -129,14 +124,22 @@ impl<'tcx> LateLintPass<'tcx> for NoopMethodCall {
|
||||||
NoopMethodCallDiag { method: call.ident.name, receiver_ty, label: span },
|
NoopMethodCallDiag { method: call.ident.name, receiver_ty, label: span },
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
if op == "borrow" {
|
match name {
|
||||||
return;
|
// If `type_of(x) == T` and `x.borrow()` is used to get `&T`,
|
||||||
}
|
// then that should be allowed
|
||||||
cx.emit_spanned_lint(
|
sym::noop_method_borrow => return,
|
||||||
|
sym::noop_method_clone => cx.emit_spanned_lint(
|
||||||
SUSPICIOUS_DOUBLE_REF_OP,
|
SUSPICIOUS_DOUBLE_REF_OP,
|
||||||
span,
|
span,
|
||||||
SuspiciousDoubleRefDiag { call: call.ident.name, ty: expr_ty, op },
|
SuspiciousDoubleRefCloneDiag { ty: expr_ty },
|
||||||
)
|
),
|
||||||
|
sym::noop_method_deref => cx.emit_spanned_lint(
|
||||||
|
SUSPICIOUS_DOUBLE_REF_OP,
|
||||||
|
span,
|
||||||
|
SuspiciousDoubleRefDerefDiag { ty: expr_ty },
|
||||||
|
),
|
||||||
|
_ => return,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue