1 //! checks for `#[inline]` on trait methods without bodies
3 use clippy_utils
::diagnostics
::span_lint_and_then
;
4 use clippy_utils
::sugg
::DiagnosticExt
;
5 use rustc_ast
::ast
::Attribute
;
6 use rustc_errors
::Applicability
;
7 use rustc_hir
::{TraitFn, TraitItem, TraitItemKind}
;
8 use rustc_lint
::{LateContext, LateLintPass}
;
9 use rustc_session
::{declare_lint_pass, declare_tool_lint}
;
10 use rustc_span
::{sym, Symbol}
;
12 declare_clippy_lint
! {
14 /// Checks for `#[inline]` on trait methods without bodies
16 /// ### Why is this bad?
17 /// Only implementations of trait methods may be inlined.
18 /// The inline attribute is ignored for trait methods without bodies.
24 /// fn name(&self) -> &'static str;
27 #[clippy::version = "pre 1.29.0"]
28 pub INLINE_FN_WITHOUT_BODY
,
30 "use of `#[inline]` on trait methods without bodies"
33 declare_lint_pass
!(InlineFnWithoutBody
=> [INLINE_FN_WITHOUT_BODY
]);
35 impl<'tcx
> LateLintPass
<'tcx
> for InlineFnWithoutBody
{
36 fn check_trait_item(&mut self, cx
: &LateContext
<'tcx
>, item
: &'tcx TraitItem
<'_
>) {
37 if let TraitItemKind
::Fn(_
, TraitFn
::Required(_
)) = item
.kind
{
38 let attrs
= cx
.tcx
.hir().attrs(item
.hir_id());
39 check_attrs(cx
, item
.ident
.name
, attrs
);
44 fn check_attrs(cx
: &LateContext
<'_
>, name
: Symbol
, attrs
: &[Attribute
]) {
46 if !attr
.has_name(sym
::inline
) {
52 INLINE_FN_WITHOUT_BODY
,
54 &format
!("use of `#[inline]` on trait method `{name}` which has no body"),
56 diag
.suggest_remove_item(cx
, attr
.span
, "remove", Applicability
::MachineApplicable
);