#![cfg_attr(feature = "deny-warnings", deny(warnings))] use clap::{App, Arg, SubCommand}; use clippy_dev::{fmt, new_lint, ra_setup, stderr_length_check, update_lints}; fn main() { let matches = App::new("Clippy developer tooling") .subcommand( SubCommand::with_name("fmt") .about("Run rustfmt on all projects and tests") .arg( Arg::with_name("check") .long("check") .help("Use the rustfmt --check option"), ) .arg( Arg::with_name("verbose") .short("v") .long("verbose") .help("Echo commands run"), ), ) .subcommand( SubCommand::with_name("update_lints") .about("Updates lint registration and information from the source code") .long_about( "Makes sure that:\n \ * the lint count in README.md is correct\n \ * the changelog contains markdown link references at the bottom\n \ * all lint groups include the correct lints\n \ * lint modules in `clippy_lints/*` are visible in `src/lib.rs` via `pub mod`\n \ * all lints are registered in the lint store", ) .arg(Arg::with_name("print-only").long("print-only").help( "Print a table of lints to STDOUT. \ This does not include deprecated and internal lints. \ (Does not modify any files)", )) .arg( Arg::with_name("check") .long("check") .help("Checks that `cargo dev update_lints` has been run. Used on CI."), ), ) .subcommand( SubCommand::with_name("new_lint") .about("Create new lint and run `cargo dev update_lints`") .arg( Arg::with_name("pass") .short("p") .long("pass") .help("Specify whether the lint runs during the early or late pass") .takes_value(true) .possible_values(&["early", "late"]) .required(true), ) .arg( Arg::with_name("name") .short("n") .long("name") .help("Name of the new lint in snake case, ex: fn_too_long") .takes_value(true) .required(true), ) .arg( Arg::with_name("category") .short("c") .long("category") .help("What category the lint belongs to") .default_value("nursery") .possible_values(&[ "style", "correctness", "complexity", "perf", "pedantic", "restriction", "cargo", "nursery", "internal", "internal_warn", ]) .takes_value(true), ), ) .subcommand( SubCommand::with_name("limit_stderr_length") .about("Ensures that stderr files do not grow longer than a certain amount of lines."), ) .subcommand( SubCommand::with_name("ra-setup") .about("Alter dependencies so rust-analyzer can find rustc internals") .arg( Arg::with_name("rustc-repo-path") .long("repo-path") .short("r") .help("The path to a rustc repo that will be used for setting the dependencies") .takes_value(true) .value_name("path") .required(true), ), ) .get_matches(); match matches.subcommand() { ("fmt", Some(matches)) => { fmt::run(matches.is_present("check"), matches.is_present("verbose")); }, ("update_lints", Some(matches)) => { if matches.is_present("print-only") { update_lints::print_lints(); } else if matches.is_present("check") { update_lints::run(update_lints::UpdateMode::Check); } else { update_lints::run(update_lints::UpdateMode::Change); } }, ("new_lint", Some(matches)) => { match new_lint::create( matches.value_of("pass"), matches.value_of("name"), matches.value_of("category"), ) { Ok(_) => update_lints::run(update_lints::UpdateMode::Change), Err(e) => eprintln!("Unable to create lint: {}", e), } }, ("limit_stderr_length", _) => { stderr_length_check::check(); }, ("ra-setup", Some(matches)) => ra_setup::run(matches.value_of("rustc-repo-path")), _ => {}, } }