From b5021411a84822cb3f1e3aeffad9550dd15bdeb6 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 16 Sep 2018 12:54:24 +0300 Subject: rename all things --- crates/ra_cli/src/main.rs | 97 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 crates/ra_cli/src/main.rs (limited to 'crates/ra_cli/src') diff --git a/crates/ra_cli/src/main.rs b/crates/ra_cli/src/main.rs new file mode 100644 index 000000000..96e5b718c --- /dev/null +++ b/crates/ra_cli/src/main.rs @@ -0,0 +1,97 @@ +extern crate clap; +#[macro_use] +extern crate failure; +extern crate ra_syntax; +extern crate ra_editor; +extern crate tools; + +use std::{ + fs, io::Read, path::Path, + time::Instant +}; +use clap::{App, Arg, SubCommand}; +use tools::collect_tests; +use ra_syntax::File; +use ra_editor::{syntax_tree, file_structure}; + +type Result = ::std::result::Result; + +fn main() -> Result<()> { + let matches = App::new("ra-cli") + .setting(clap::AppSettings::SubcommandRequiredElseHelp) + .subcommand( + SubCommand::with_name("render-test") + .arg( + Arg::with_name("line") + .long("--line") + .required(true) + .takes_value(true), + ) + .arg( + Arg::with_name("file") + .long("--file") + .required(true) + .takes_value(true), + ), + ) + .subcommand( + SubCommand::with_name("parse") + .arg(Arg::with_name("no-dump").long("--no-dump")) + ) + .subcommand(SubCommand::with_name("symbols")) + .get_matches(); + match matches.subcommand() { + ("parse", Some(matches)) => { + let start = Instant::now(); + let file = file()?; + let elapsed = start.elapsed(); + if !matches.is_present("no-dump") { + println!("{}", syntax_tree(&file)); + } + eprintln!("parsing: {:?}", elapsed); + ::std::mem::forget(file); + } + ("symbols", _) => { + let file = file()?; + for s in file_structure(&file) { + println!("{:?}", s); + } + } + ("render-test", Some(matches)) => { + let file = matches.value_of("file").unwrap(); + let file = Path::new(file); + let line: usize = matches.value_of("line").unwrap().parse()?; + let line = line - 1; + let (test, tree) = render_test(file, line)?; + println!("{}\n{}", test, tree); + } + _ => unreachable!(), + } + Ok(()) +} + +fn file() -> Result { + let text = read_stdin()?; + Ok(File::parse(&text)) +} + +fn read_stdin() -> Result { + let mut buff = String::new(); + ::std::io::stdin().read_to_string(&mut buff)?; + Ok(buff) +} + +fn render_test(file: &Path, line: usize) -> Result<(String, String)> { + let text = fs::read_to_string(file)?; + let tests = collect_tests(&text); + let test = tests.into_iter().find(|(start_line, t)| { + *start_line <= line && line <= *start_line + t.text.lines().count() + }); + let test = match test { + None => bail!("No test found at line {} at {}", line, file.display()), + Some((_start_line, test)) => test, + }; + let file = File::parse(&test.text); + let tree = syntax_tree(&file); + Ok((test.text, tree)) +} -- cgit v1.2.3