]> git.lizzy.rs Git - rust.git/blob - clippy_lints/src/pub_use.rs
Merge branch 'master' into doc_link_with_quotes
[rust.git] / clippy_lints / src / pub_use.rs
1 use clippy_utils::diagnostics::span_lint_and_help;
2 use rustc_ast::ast::{Item, ItemKind, VisibilityKind};
3 use rustc_lint::{EarlyContext, EarlyLintPass};
4 use rustc_session::{declare_lint_pass, declare_tool_lint};
5
6 declare_clippy_lint! {
7     /// ### What it does
8     ///
9     /// Restricts the usage of `pub use ...`
10     ///
11     /// ### Why is this bad?
12     ///
13     /// `pub use` is usually fine, but a project may wish to limit `pub use` instances to prevent
14     /// unintentional exports or to encourage placing exported items directly in public modules
15     ///
16     /// ### Example
17     /// ```rust
18     /// pub mod outer {
19     ///     mod inner {
20     ///         pub struct Test {}
21     ///     }
22     ///     pub use inner::Test;
23     /// }
24     ///
25     /// use outer::Test;
26     /// ```
27     /// Use instead:
28     /// ```rust
29     /// pub mod outer {
30     ///     pub struct Test {}
31     /// }
32     ///
33     /// use outer::Test;
34     /// ```
35     #[clippy::version = "1.62.0"]
36     pub PUB_USE,
37     restriction,
38     "restricts the usage of `pub use`"
39 }
40 declare_lint_pass!(PubUse => [PUB_USE]);
41
42 impl EarlyLintPass for PubUse {
43     fn check_item(&mut self, cx: &EarlyContext<'_>, item: &Item) {
44         if let ItemKind::Use(_) = item.kind &&
45             let VisibilityKind::Public = item.vis.kind {
46                 span_lint_and_help(
47                     cx,
48                     PUB_USE,
49                     item.span,
50                     "using `pub use`",
51                     None,
52                     "move the exported item to a public module instead",
53                 );
54             }
55     }
56 }