]> git.proxmox.com Git - rustc.git/blame - src/tools/clippy/clippy_lints/src/inline_fn_without_body.rs
New upstream version 1.52.1+dfsg1
[rustc.git] / src / tools / clippy / clippy_lints / src / inline_fn_without_body.rs
CommitLineData
f20569fa
XL
1//! checks for `#[inline]` on trait methods without bodies
2
3use crate::utils::span_lint_and_then;
4use crate::utils::sugg::DiagnosticBuilderExt;
5use rustc_ast::ast::Attribute;
6use rustc_errors::Applicability;
7use rustc_hir::{TraitFn, TraitItem, TraitItemKind};
8use rustc_lint::{LateContext, LateLintPass};
9use rustc_session::{declare_lint_pass, declare_tool_lint};
10use rustc_span::{sym, Symbol};
11
12declare_clippy_lint! {
13 /// **What it does:** Checks for `#[inline]` on trait methods without bodies
14 ///
15 /// **Why is this bad?** Only implementations of trait methods may be inlined.
16 /// The inline attribute is ignored for trait methods without bodies.
17 ///
18 /// **Known problems:** None.
19 ///
20 /// **Example:**
21 /// ```rust
22 /// trait Animal {
23 /// #[inline]
24 /// fn name(&self) -> &'static str;
25 /// }
26 /// ```
27 pub INLINE_FN_WITHOUT_BODY,
28 correctness,
29 "use of `#[inline]` on trait methods without bodies"
30}
31
32declare_lint_pass!(InlineFnWithoutBody => [INLINE_FN_WITHOUT_BODY]);
33
34impl<'tcx> LateLintPass<'tcx> for InlineFnWithoutBody {
35 fn check_trait_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx TraitItem<'_>) {
36 if let TraitItemKind::Fn(_, TraitFn::Required(_)) = item.kind {
37 let attrs = cx.tcx.hir().attrs(item.hir_id());
38 check_attrs(cx, item.ident.name, attrs);
39 }
40 }
41}
42
43fn check_attrs(cx: &LateContext<'_>, name: Symbol, attrs: &[Attribute]) {
44 for attr in attrs {
45 if !attr.has_name(sym::inline) {
46 continue;
47 }
48
49 span_lint_and_then(
50 cx,
51 INLINE_FN_WITHOUT_BODY,
52 attr.span,
53 &format!("use of `#[inline]` on trait method `{}` which has no body", name),
54 |diag| {
55 diag.suggest_remove_item(cx, attr.span, "remove", Applicability::MachineApplicable);
56 },
57 );
58 }
59}