diff --git a/cli/loader/src/lib.rs b/cli/loader/src/lib.rs index 6f8605f4..0f92b051 100644 --- a/cli/loader/src/lib.rs +++ b/cli/loader/src/lib.rs @@ -10,7 +10,7 @@ use std::path::{Path, PathBuf}; use std::process::Command; use std::sync::Mutex; use std::time::SystemTime; -use std::{fs, mem}; +use std::{env, fs, mem}; use tree_sitter::{Language, QueryError, QueryErrorKind}; use tree_sitter_highlight::HighlightConfiguration; use tree_sitter_tags::{Error as TagsError, TagsConfiguration}; @@ -108,9 +108,12 @@ unsafe impl Sync for Loader {} impl Loader { pub fn new() -> Result { - let parser_lib_path = dirs::cache_dir() - .ok_or(anyhow!("Cannot determine cache directory"))? - .join("tree-sitter/lib"); + let parser_lib_path = match env::var("TREE_SITTER_LIBDIR") { + Ok(path) => PathBuf::from(path), + _ => dirs::cache_dir() + .ok_or(anyhow!("Cannot determine cache directory"))? + .join("tree-sitter/lib"), + }; Ok(Self::with_parser_lib_path(parser_lib_path)) } diff --git a/cli/src/main.rs b/cli/src/main.rs index ce6743bf..c1dd2501 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,7 +1,7 @@ use anyhow::{anyhow, Context, Result}; use clap::{App, AppSettings, Arg, SubCommand}; use glob::glob; -use std::path::Path; +use std::path::{Path, PathBuf}; use std::{env, fs, u64}; use tree_sitter_cli::{ generate, highlight, logger, parse, playground, query, tags, test, test_highlight, test_tags, @@ -106,13 +106,25 @@ fn run() -> Result<()> { )), ) .arg(Arg::with_name("no-bindings").long("no-bindings")) + .arg( + Arg::with_name("build") + .long("build") + .short("b") + .help("Compile all defined languages in the current dir"), + ) + .arg(&debug_build_arg) + .arg( + Arg::with_name("libdir") + .long("libdir") + .takes_value(true) + .value_name("path"), + ) .arg( Arg::with_name("report-states-for-rule") .long("report-states-for-rule") .value_name("rule-name") .takes_value(true), - ) - .arg(Arg::with_name("no-minimize").long("no-minimize")), + ), ) .subcommand( SubCommand::with_name("parse") @@ -270,6 +282,9 @@ fn run() -> Result<()> { ("generate", Some(matches)) => { let grammar_path = matches.value_of("grammar-path"); + let debug_build = matches.is_present("debug-build"); + let build = matches.is_present("build"); + let libdir = matches.value_of("libdir"); let report_symbol_name = matches.value_of("report-states-for-rule").or_else(|| { if matches.is_present("report-states") { Some("") @@ -298,6 +313,13 @@ fn run() -> Result<()> { generate_bindings, report_symbol_name, )?; + if build { + if let Some(path) = libdir { + loader = loader::Loader::with_parser_lib_path(PathBuf::from(path)); + } + loader.use_debug_build(debug_build); + loader.languages_at_path(¤t_dir)?; + } } ("test", Some(matches)) => {