2 gather_all, gen_changelog_lint_list, gen_deprecated, gen_lint_group_list, gen_modules_list, gen_register_lint_list,
3 replace_region_in_file, Lint, DOCS_LINK,
7 #[derive(Clone, Copy, PartialEq)]
13 #[allow(clippy::too_many_lines)]
14 pub fn run(update_mode: UpdateMode) {
15 let lint_list: Vec<Lint> = gather_all().collect();
17 let internal_lints = Lint::internal_lints(&lint_list);
18 let deprecated_lints = Lint::deprecated_lints(&lint_list);
19 let usable_lints = Lint::usable_lints(&lint_list);
20 let mut sorted_usable_lints = usable_lints.clone();
21 sorted_usable_lints.sort_by_key(|lint| lint.name.clone());
23 let usable_lint_count = round_to_fifty(usable_lints.len());
25 let mut file_change = replace_region_in_file(
26 Path::new("src/lintlist/mod.rs"),
30 update_mode == UpdateMode::Change,
32 format!("pub static ref ALL_LINTS: Vec<Lint> = vec!{:#?};", sorted_usable_lints)
34 .map(ToString::to_string)
40 file_change |= replace_region_in_file(
41 Path::new("README.md"),
43 r#"\[There are over \d+ lints included in this crate!\]\({}\)"#,
48 update_mode == UpdateMode::Change,
51 "[There are over {} lints included in this crate!]({})",
52 usable_lint_count, DOCS_LINK
58 file_change |= replace_region_in_file(
59 Path::new("CHANGELOG.md"),
60 "<!-- begin autogenerated links to lint list -->",
61 "<!-- end autogenerated links to lint list -->",
63 update_mode == UpdateMode::Change,
64 || gen_changelog_lint_list(usable_lints.iter().chain(deprecated_lints.iter())),
68 file_change |= replace_region_in_file(
69 Path::new("clippy_lints/src/lib.rs"),
70 "begin deprecated lints",
71 "end deprecated lints",
73 update_mode == UpdateMode::Change,
74 || gen_deprecated(deprecated_lints.iter()),
78 file_change |= replace_region_in_file(
79 Path::new("clippy_lints/src/lib.rs"),
80 "begin register lints",
83 update_mode == UpdateMode::Change,
84 || gen_register_lint_list(usable_lints.iter().chain(internal_lints.iter())),
88 file_change |= replace_region_in_file(
89 Path::new("clippy_lints/src/lib.rs"),
90 "begin lints modules",
93 update_mode == UpdateMode::Change,
94 || gen_modules_list(usable_lints.iter()),
98 // Generate lists of lints in the clippy::all lint group
99 file_change |= replace_region_in_file(
100 Path::new("clippy_lints/src/lib.rs"),
101 r#"store.register_group\(true, "clippy::all""#,
104 update_mode == UpdateMode::Change,
106 // clippy::all should only include the following lint groups:
107 let all_group_lints = usable_lints.iter().filter(|l| {
108 l.group == "correctness" || l.group == "style" || l.group == "complexity" || l.group == "perf"
111 gen_lint_group_list(all_group_lints)
116 // Generate the list of lints for all other lint groups
117 for (lint_group, lints) in Lint::by_lint_group(usable_lints.into_iter().chain(internal_lints)) {
118 file_change |= replace_region_in_file(
119 Path::new("clippy_lints/src/lib.rs"),
120 &format!("store.register_group\\(true, \"clippy::{}\"", lint_group),
123 update_mode == UpdateMode::Change,
124 || gen_lint_group_list(lints.iter()),
129 if update_mode == UpdateMode::Check && file_change {
131 "Not all lints defined properly. \
132 Please run `cargo dev update_lints` to make sure all lints are defined properly."
134 std::process::exit(1);
138 pub fn print_lints() {
139 let lint_list: Vec<Lint> = gather_all().collect();
140 let usable_lints = Lint::usable_lints(&lint_list);
141 let usable_lint_count = usable_lints.len();
142 let grouped_by_lint_group = Lint::by_lint_group(usable_lints.into_iter());
144 for (lint_group, mut lints) in grouped_by_lint_group {
145 if lint_group == "Deprecated" {
148 println!("\n## {}", lint_group);
150 lints.sort_by_key(|l| l.name.clone());
153 println!("* [{}]({}#{}) ({})", lint.name, DOCS_LINK, lint.name, lint.desc);
157 println!("there are {} lints", usable_lint_count);
160 fn round_to_fifty(count: usize) -> usize {