aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_tools
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2019-09-10 18:37:21 +0100
committerGitHub <[email protected]>2019-09-10 18:37:21 +0100
commit1140a83c1b393cdcd18e42d5d816fd8be348b059 (patch)
treee2cd3ed0feabb81b4a51b1150542c5d7da920679 /crates/ra_tools
parent753a569c79c5a4a1dd7624028cc85fa9590da53d (diff)
parentaa894ace1fc4600dbc94bccb05532154ee2288d8 (diff)
Merge #1806
1806: refactor(args): Switch to pico-args r=matklad a=Geobert Fixes https://github.com/rust-analyzer/rust-analyzer/issues/1768 Co-authored-by: Geobert Quach <[email protected]>
Diffstat (limited to 'crates/ra_tools')
-rw-r--r--crates/ra_tools/Cargo.toml2
-rw-r--r--crates/ra_tools/src/help.rs45
-rw-r--r--crates/ra_tools/src/main.rs117
3 files changed, 131 insertions, 33 deletions
diff --git a/crates/ra_tools/Cargo.toml b/crates/ra_tools/Cargo.toml
index b94a0b18d..848ca408d 100644
--- a/crates/ra_tools/Cargo.toml
+++ b/crates/ra_tools/Cargo.toml
@@ -8,7 +8,7 @@ publish = false
8[dependencies] 8[dependencies]
9walkdir = "2.1.3" 9walkdir = "2.1.3"
10itertools = "0.8.0" 10itertools = "0.8.0"
11clap = { version = "2.32.0", default-features = false } 11pico-args = "0.2.0"
12quote = "1.0.2" 12quote = "1.0.2"
13proc-macro2 = "1.0.1" 13proc-macro2 = "1.0.1"
14ron = "0.5.1" 14ron = "0.5.1"
diff --git a/crates/ra_tools/src/help.rs b/crates/ra_tools/src/help.rs
new file mode 100644
index 000000000..6dde6c2d2
--- /dev/null
+++ b/crates/ra_tools/src/help.rs
@@ -0,0 +1,45 @@
1pub const GLOBAL_HELP: &str = "tasks
2
3USAGE:
4 ra_tools <SUBCOMMAND>
5
6FLAGS:
7 -h, --help Prints help information
8
9SUBCOMMANDS:
10 format
11 format-hook
12 fuzz-tests
13 gen-syntax
14 gen-tests
15 install-ra
16 lint";
17
18pub const INSTALL_RA_HELP: &str = "ra_tools-install-ra
19
20USAGE:
21 ra_tools.exe install-ra [FLAGS]
22
23FLAGS:
24 --client-code
25 -h, --help Prints help information
26 --jemalloc
27 --server";
28
29pub fn print_no_param_subcommand_help(subcommand: &str) {
30 eprintln!(
31 "ra_tools-{}
32
33USAGE:
34 ra_tools {}
35
36FLAGS:
37 -h, --help Prints help information",
38 subcommand, subcommand
39 );
40}
41
42pub const INSTALL_RA_CONFLICT: &str =
43 "error: The argument `--server` cannot be used with `--client-code`
44
45For more information try --help";
diff --git a/crates/ra_tools/src/main.rs b/crates/ra_tools/src/main.rs
index 33badf290..f96f1875f 100644
--- a/crates/ra_tools/src/main.rs
+++ b/crates/ra_tools/src/main.rs
@@ -1,5 +1,8 @@
1use clap::{App, Arg, SubCommand}; 1mod help;
2
3use core::fmt::Write;
2use core::str; 4use core::str;
5use pico_args::Arguments;
3use ra_tools::{ 6use ra_tools::{
4 gen_tests, generate_boilerplate, install_format_hook, run, run_clippy, run_fuzzer, run_rustfmt, 7 gen_tests, generate_boilerplate, install_format_hook, run, run_clippy, run_fuzzer, run_rustfmt,
5 Cmd, Overwrite, Result, 8 Cmd, Overwrite, Result,
@@ -20,45 +23,95 @@ struct ServerOpt {
20} 23}
21 24
22fn main() -> Result<()> { 25fn main() -> Result<()> {
23 let matches = App::new("tasks") 26 let subcommand = match std::env::args_os().nth(1) {
24 .setting(clap::AppSettings::SubcommandRequiredElseHelp) 27 None => {
25 .subcommand(SubCommand::with_name("gen-syntax")) 28 eprintln!("{}", help::GLOBAL_HELP);
26 .subcommand(SubCommand::with_name("gen-tests")) 29 return Ok(());
27 .subcommand( 30 }
28 SubCommand::with_name("install-ra") 31 Some(s) => s,
29 .arg(Arg::with_name("server").long("--server")) 32 };
30 .arg(Arg::with_name("jemalloc").long("jemalloc")) 33 let mut matches = Arguments::from_vec(std::env::args_os().skip(2).collect());
31 .arg(Arg::with_name("client-code").long("client-code").conflicts_with("server")), 34 let subcommand = &*subcommand.to_string_lossy();
32 ) 35 match subcommand {
33 .alias("install-code") 36 "install-ra" | "install-code" => {
34 .subcommand(SubCommand::with_name("format")) 37 if matches.contains(["-h", "--help"]) {
35 .subcommand(SubCommand::with_name("format-hook")) 38 eprintln!("{}", help::INSTALL_RA_HELP);
36 .subcommand(SubCommand::with_name("fuzz-tests")) 39 return Ok(());
37 .subcommand(SubCommand::with_name("lint")) 40 }
38 .get_matches(); 41 let server = matches.contains("--server");
39 match matches.subcommand() { 42 let client_code = matches.contains("--client-code");
40 ("install-ra", Some(matches)) => { 43 if server && client_code {
44 eprintln!("{}", help::INSTALL_RA_CONFLICT);
45 return Ok(());
46 }
47 let jemalloc = matches.contains("--jemalloc");
48 matches.finish().or_else(handle_extra_flags)?;
41 let opts = InstallOpt { 49 let opts = InstallOpt {
42 client: if matches.is_present("server") { None } else { Some(ClientOpt::VsCode) }, 50 client: if server { None } else { Some(ClientOpt::VsCode) },
43 server: if matches.is_present("client-code") { 51 server: if client_code { None } else { Some(ServerOpt { jemalloc: jemalloc }) },
44 None
45 } else {
46 Some(ServerOpt { jemalloc: matches.is_present("jemalloc") })
47 },
48 }; 52 };
49 install(opts)? 53 install(opts)?
50 } 54 }
51 ("gen-tests", _) => gen_tests(Overwrite)?, 55 "gen-tests" => {
52 ("gen-syntax", _) => generate_boilerplate(Overwrite)?, 56 if matches.contains(["-h", "--help"]) {
53 ("format", _) => run_rustfmt(Overwrite)?, 57 help::print_no_param_subcommand_help(&subcommand);
54 ("format-hook", _) => install_format_hook()?, 58 return Ok(());
55 ("lint", _) => run_clippy()?, 59 }
56 ("fuzz-tests", _) => run_fuzzer()?, 60 gen_tests(Overwrite)?
57 _ => unreachable!(), 61 }
62 "gen-syntax" => {
63 if matches.contains(["-h", "--help"]) {
64 help::print_no_param_subcommand_help(&subcommand);
65 return Ok(());
66 }
67 generate_boilerplate(Overwrite)?
68 }
69 "format" => {
70 if matches.contains(["-h", "--help"]) {
71 help::print_no_param_subcommand_help(&subcommand);
72 return Ok(());
73 }
74 run_rustfmt(Overwrite)?
75 }
76 "format-hook" => {
77 if matches.contains(["-h", "--help"]) {
78 help::print_no_param_subcommand_help(&subcommand);
79 return Ok(());
80 }
81 install_format_hook()?
82 }
83 "lint" => {
84 if matches.contains(["-h", "--help"]) {
85 help::print_no_param_subcommand_help(&subcommand);
86 return Ok(());
87 }
88 run_clippy()?
89 }
90 "fuzz-tests" => {
91 if matches.contains(["-h", "--help"]) {
92 help::print_no_param_subcommand_help(&subcommand);
93 return Ok(());
94 }
95 run_fuzzer()?
96 }
97 _ => eprintln!("{}", help::GLOBAL_HELP),
58 } 98 }
59 Ok(()) 99 Ok(())
60} 100}
61 101
102fn handle_extra_flags(e: pico_args::Error) -> Result<()> {
103 if let pico_args::Error::UnusedArgsLeft(flags) = e {
104 let mut invalid_flags = String::new();
105 for flag in flags {
106 write!(&mut invalid_flags, "{}, ", flag)?;
107 }
108 let (invalid_flags, _) = invalid_flags.split_at(invalid_flags.len() - 2);
109 Err(format!("Invalid flags: {}", invalid_flags).into())
110 } else {
111 Err(e.to_string().into())
112 }
113}
114
62fn install(opts: InstallOpt) -> Result<()> { 115fn install(opts: InstallOpt) -> Result<()> {
63 if cfg!(target_os = "macos") { 116 if cfg!(target_os = "macos") {
64 fix_path_for_mac()? 117 fix_path_for_mac()?