Files
rust/crates/ra_cli/src/main.rs

62 lines
1.9 KiB
Rust
Raw Normal View History

mod analysis_stats;
2019-05-12 20:55:17 +03:00
use std::io::Read;
2018-07-30 16:16:58 +03:00
use clap::{App, Arg, SubCommand};
use ra_ide_api::file_structure;
2019-03-30 13:25:53 +03:00
use ra_syntax::{SourceFile, TreeArc, AstNode};
use flexi_logger::Logger;
2019-04-02 17:52:04 +03:00
use ra_prof::profile;
2018-07-30 16:16:58 +03:00
type Result<T> = ::std::result::Result<T, failure::Error>;
fn main() -> Result<()> {
Logger::with_env().start()?;
2018-09-16 12:54:24 +03:00
let matches = App::new("ra-cli")
2018-07-30 16:16:58 +03:00
.setting(clap::AppSettings::SubcommandRequiredElseHelp)
.subcommand(SubCommand::with_name("parse").arg(Arg::with_name("no-dump").long("--no-dump")))
2018-08-05 19:06:14 +03:00
.subcommand(SubCommand::with_name("symbols"))
.subcommand(
SubCommand::with_name("analysis-stats")
.arg(Arg::with_name("verbose").short("v"))
.arg(Arg::with_name("only").short("o").takes_value(true))
.arg(Arg::with_name("path")),
)
2018-07-30 16:16:58 +03:00
.get_matches();
match matches.subcommand() {
2018-08-07 03:50:40 +03:00
("parse", Some(matches)) => {
2019-04-02 17:52:04 +03:00
let _p = profile("parsing");
2018-08-05 19:06:14 +03:00
let file = file()?;
2018-08-07 03:50:40 +03:00
if !matches.is_present("no-dump") {
2019-02-21 15:51:22 +03:00
println!("{}", file.syntax().debug_dump());
2018-08-07 03:50:40 +03:00
}
2018-08-08 21:14:18 +03:00
::std::mem::forget(file);
2018-08-05 19:06:14 +03:00
}
("symbols", _) => {
let file = file()?;
2018-08-14 11:20:09 +03:00
for s in file_structure(&file) {
2018-08-05 19:06:14 +03:00
println!("{:?}", s);
}
2018-07-31 15:40:40 +03:00
}
("analysis-stats", Some(matches)) => {
let verbose = matches.is_present("verbose");
let path = matches.value_of("path").unwrap_or("");
let only = matches.value_of("only");
analysis_stats::run(verbose, path, only)?;
}
2018-07-30 16:16:58 +03:00
_ => unreachable!(),
}
Ok(())
}
fn file() -> Result<TreeArc<SourceFile>> {
2018-07-30 16:16:58 +03:00
let text = read_stdin()?;
2019-01-07 17:06:54 +03:00
Ok(SourceFile::parse(&text))
2018-07-30 16:16:58 +03:00
}
fn read_stdin() -> Result<String> {
let mut buff = String::new();
::std::io::stdin().read_to_string(&mut buff)?;
Ok(buff)
}