Move declare_clippy_lint back into clippy_lints

This commit is contained in:
Samuel E. Moelius III 2021-02-18 12:25:35 -05:00
parent c7869b82a2
commit ab7381f085
9 changed files with 112 additions and 124 deletions

View File

@ -186,17 +186,11 @@ fn gather_from_file(dir_entry: &walkdir::DirEntry) -> impl Iterator<Item = Lint>
let path_buf = path.with_file_name(filename); let path_buf = path.with_file_name(filename);
let mut rel_path = path_buf let mut rel_path = path_buf
.strip_prefix(clippy_project_root().join("clippy_lints/src")) .strip_prefix(clippy_project_root().join("clippy_lints/src"))
.map(PathBuf::from) .expect("only files in `clippy_lints/src` should be looked at");
.or_else(|_| {
path_buf
.strip_prefix(clippy_project_root().join("clippy_utils/src"))
.map(|c| Path::new("utils").join(c))
})
.expect("only files in `clippy_lints/src` or `clippy_utils/src` should be looked at");
// If the lints are stored in mod.rs, we get the module name from // If the lints are stored in mod.rs, we get the module name from
// the containing directory: // the containing directory:
if filename == "mod" { if filename == "mod" {
rel_path = rel_path.parent().unwrap().to_path_buf(); rel_path = rel_path.parent().unwrap();
} }
let module = rel_path let module = rel_path
@ -219,15 +213,13 @@ fn parse_contents(content: &str, module: &str) -> impl Iterator<Item = Lint> {
lints.chain(deprecated).collect::<Vec<Lint>>().into_iter() lints.chain(deprecated).collect::<Vec<Lint>>().into_iter()
} }
/// Collects all .rs files in the `clippy_lints/src` and `clippy_utils/src` directories /// Collects all .rs files in the `clippy_lints/src` directory
fn lint_files() -> impl Iterator<Item = walkdir::DirEntry> { fn lint_files() -> impl Iterator<Item = walkdir::DirEntry> {
// We use `WalkDir` instead of `fs::read_dir` here in order to recurse into subdirectories. // We use `WalkDir` instead of `fs::read_dir` here in order to recurse into subdirectories.
// Otherwise we would not collect all the lints, for example in `clippy_lints/src/methods/`. // Otherwise we would not collect all the lints, for example in `clippy_lints/src/methods/`.
let clippy_lints_path = clippy_project_root().join("clippy_lints/src"); let path = clippy_project_root().join("clippy_lints/src");
let clippy_utils_path = clippy_project_root().join("clippy_utils/src"); WalkDir::new(path)
WalkDir::new(clippy_lints_path)
.into_iter() .into_iter()
.chain(WalkDir::new(clippy_utils_path).into_iter())
.filter_map(Result::ok) .filter_map(Result::ok)
.filter(|f| f.path().extension() == Some(OsStr::new("rs"))) .filter(|f| f.path().extension() == Some(OsStr::new("rs")))
} }

View File

@ -46,9 +46,103 @@ use rustc_data_structures::fx::FxHashSet;
use rustc_lint::LintId; use rustc_lint::LintId;
use rustc_session::Session; use rustc_session::Session;
/// Macro used to declare a Clippy lint.
///
/// Every lint declaration consists of 4 parts:
///
/// 1. The documentation, which is used for the website
/// 2. The `LINT_NAME`. See [lint naming][lint_naming] on lint naming conventions.
/// 3. The `lint_level`, which is a mapping from *one* of our lint groups to `Allow`, `Warn` or
/// `Deny`. The lint level here has nothing to do with what lint groups the lint is a part of.
/// 4. The `description` that contains a short explanation on what's wrong with code where the
/// lint is triggered.
///
/// Currently the categories `style`, `correctness`, `complexity` and `perf` are enabled by default.
/// As said in the README.md of this repository, if the lint level mapping changes, please update
/// README.md.
///
/// # Example
///
/// ```
/// #![feature(rustc_private)]
/// extern crate rustc_session;
/// use rustc_session::declare_tool_lint;
/// use clippy_lints::declare_clippy_lint;
///
/// declare_clippy_lint! {
/// /// **What it does:** Checks for ... (describe what the lint matches).
/// ///
/// /// **Why is this bad?** Supply the reason for linting the code.
/// ///
/// /// **Known problems:** None. (Or describe where it could go wrong.)
/// ///
/// /// **Example:**
/// ///
/// /// ```rust
/// /// // Bad
/// /// Insert a short example of code that triggers the lint
/// ///
/// /// // Good
/// /// Insert a short example of improved code that doesn't trigger the lint
/// /// ```
/// pub LINT_NAME,
/// pedantic,
/// "description"
/// }
/// ```
/// [lint_naming]: https://rust-lang.github.io/rfcs/0344-conventions-galore.html#lints
#[macro_export] #[macro_export]
macro_rules! declare_clippy_lint { macro_rules! declare_clippy_lint {
( $($x:tt)* ) => { clippy_utils::declare_clippy_lint!($($x)*); } { $(#[$attr:meta])* pub $name:tt, style, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Warn, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, correctness, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Deny, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, complexity, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Warn, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, perf, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Warn, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, pedantic, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Allow, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, restriction, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Allow, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, cargo, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Allow, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, nursery, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Allow, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, internal, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Allow, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, internal_warn, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Warn, $description, report_in_external_macro: true
}
};
} }
#[macro_export] #[macro_export]

View File

@ -1 +0,0 @@
pub use clippy_utils::*;

View File

@ -1,7 +1,7 @@
//! A group of attributes that can be attached to Rust code in order //! A group of attributes that can be attached to Rust code in order
//! to generate a clippy lint detecting said code automatically. //! to generate a clippy lint detecting said code automatically.
use crate::{declare_clippy_lint, get_attr}; use crate::utils::get_attr;
use rustc_ast::ast::{Attribute, LitFloatType, LitKind}; use rustc_ast::ast::{Attribute, LitFloatType, LitKind};
use rustc_ast::walk_list; use rustc_ast::walk_list;
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;

View File

@ -1,6 +1,6 @@
//! checks for attributes //! checks for attributes
use crate::{declare_clippy_lint, get_attr}; use crate::utils::get_attr;
use rustc_ast::ast::{Attribute, InlineAsmTemplatePiece}; use rustc_ast::ast::{Attribute, InlineAsmTemplatePiece};
use rustc_hir as hir; use rustc_hir as hir;
use rustc_lint::{LateContext, LateLintPass, LintContext}; use rustc_lint::{LateContext, LateLintPass, LintContext};

View File

@ -1,7 +1,7 @@
use crate::consts::{constant_simple, Constant}; use crate::consts::{constant_simple, Constant};
use crate::{ use crate::utils::{
declare_clippy_lint, is_expn_of, match_def_path, match_qpath, match_type, method_calls, path_to_res, paths, is_expn_of, match_def_path, match_qpath, match_type, method_calls, path_to_res, paths, run_lints, snippet,
run_lints, snippet, span_lint, span_lint_and_help, span_lint_and_sugg, SpanlessEq, span_lint, span_lint_and_help, span_lint_and_sugg, SpanlessEq,
}; };
use if_chain::if_chain; use if_chain::if_chain;
use rustc_ast::ast::{Crate as AstCrate, ItemKind, LitKind, NodeId}; use rustc_ast::ast::{Crate as AstCrate, ItemKind, LitKind, NodeId};

View File

@ -0,0 +1,6 @@
pub mod author;
pub mod inspector;
#[cfg(feature = "internal-lints")]
pub mod internal_lints;
pub use clippy_utils::*;

View File

@ -30,7 +30,6 @@ pub mod sym_helper;
#[allow(clippy::module_name_repetitions)] #[allow(clippy::module_name_repetitions)]
pub mod ast_utils; pub mod ast_utils;
pub mod attrs; pub mod attrs;
pub mod author;
pub mod camel_case; pub mod camel_case;
pub mod comparisons; pub mod comparisons;
pub mod conf; pub mod conf;
@ -39,9 +38,6 @@ mod diagnostics;
pub mod eager_or_lazy; pub mod eager_or_lazy;
pub mod higher; pub mod higher;
mod hir_utils; mod hir_utils;
pub mod inspector;
#[cfg(feature = "internal-lints")]
pub mod internal_lints;
pub mod numeric_literal; pub mod numeric_literal;
pub mod paths; pub mod paths;
pub mod ptr; pub mod ptr;
@ -90,105 +86,6 @@ use smallvec::SmallVec;
use crate::consts::{constant, Constant}; use crate::consts::{constant, Constant};
/// Macro used to declare a Clippy lint.
///
/// Every lint declaration consists of 4 parts:
///
/// 1. The documentation, which is used for the website
/// 2. The `LINT_NAME`. See [lint naming][lint_naming] on lint naming conventions.
/// 3. The `lint_level`, which is a mapping from *one* of our lint groups to `Allow`, `Warn` or
/// `Deny`. The lint level here has nothing to do with what lint groups the lint is a part of.
/// 4. The `description` that contains a short explanation on what's wrong with code where the
/// lint is triggered.
///
/// Currently the categories `style`, `correctness`, `complexity` and `perf` are enabled by default.
/// As said in the README.md of this repository, if the lint level mapping changes, please update
/// README.md.
///
/// # Example
///
/// ```
/// #![feature(rustc_private)]
/// extern crate rustc_session;
/// use rustc_session::declare_tool_lint;
/// use clippy_utils::declare_clippy_lint;
///
/// declare_clippy_lint! {
/// /// **What it does:** Checks for ... (describe what the lint matches).
/// ///
/// /// **Why is this bad?** Supply the reason for linting the code.
/// ///
/// /// **Known problems:** None. (Or describe where it could go wrong.)
/// ///
/// /// **Example:**
/// ///
/// /// ```rust
/// /// // Bad
/// /// Insert a short example of code that triggers the lint
/// ///
/// /// // Good
/// /// Insert a short example of improved code that doesn't trigger the lint
/// /// ```
/// pub LINT_NAME,
/// pedantic,
/// "description"
/// }
/// ```
/// [lint_naming]: https://rust-lang.github.io/rfcs/0344-conventions-galore.html#lints
#[macro_export]
macro_rules! declare_clippy_lint {
{ $(#[$attr:meta])* pub $name:tt, style, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Warn, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, correctness, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Deny, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, complexity, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Warn, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, perf, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Warn, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, pedantic, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Allow, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, restriction, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Allow, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, cargo, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Allow, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, nursery, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Allow, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, internal, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Allow, $description, report_in_external_macro: true
}
};
{ $(#[$attr:meta])* pub $name:tt, internal_warn, $description:tt } => {
declare_tool_lint! {
$(#[$attr])* pub clippy::$name, Warn, $description, report_in_external_macro: true
}
};
}
pub fn parse_msrv(msrv: &str, sess: Option<&Session>, span: Option<Span>) -> Option<RustcVersion> { pub fn parse_msrv(msrv: &str, sess: Option<&Session>, span: Option<Span>) -> Option<RustcVersion> {
if let Ok(version) = RustcVersion::parse(msrv) { if let Ok(version) = RustcVersion::parse(msrv) {
return Some(version); return Some(version);

View File

@ -1,4 +1,4 @@
thread 'rustc' panicked at 'Would you like some help with that?', clippy_utils/src/internal_lints.rs thread 'rustc' panicked at 'Would you like some help with that?', clippy_lints/src/utils/internal_lints.rs
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: internal compiler error: unexpected panic error: internal compiler error: unexpected panic