diff --git a/crates/elp/src/bin/args.rs b/crates/elp/src/bin/args.rs index 1102be1a83..e6f2c2f026 100644 --- a/crates/elp/src/bin/args.rs +++ b/crates/elp/src/bin/args.rs @@ -328,6 +328,8 @@ pub struct Args { pub log_file: Option, #[bpaf(argument("ERL"))] pub erl: Option, + #[bpaf(argument("ESCRIPT"))] + pub escript: Option, pub no_log_buffering: bool, #[bpaf(external(command))] pub command: Command, diff --git a/crates/elp/src/bin/main.rs b/crates/elp/src/bin/main.rs index 2d460fb742..3086037251 100644 --- a/crates/elp/src/bin/main.rs +++ b/crates/elp/src/bin/main.rs @@ -19,6 +19,7 @@ use bpaf::batteries; use elp::cli; use elp::cli::Cli; use elp::ServerSetup; +use elp_ide::erlang_service::ESCRIPT; use elp_log::timeit; use elp_log::FileLogger; use elp_log::Logger; @@ -85,6 +86,12 @@ fn setup_static(args: &Args) { let mut erl = ERL.write().unwrap(); *erl = path.to_string_lossy().to_string(); } + + if let Some(escript) = &args.escript { + let path = fs::canonicalize(escript).expect("escript path should be valid"); + let mut escript = ESCRIPT.write().unwrap(); + *escript = path.to_string_lossy().to_string(); + } } fn try_main(cli: &mut dyn Cli, args: Args) -> Result<()> { diff --git a/crates/elp/src/resources/test/help.stdout b/crates/elp/src/resources/test/help.stdout index fed84c40b1..0bc23f26be 100644 --- a/crates/elp/src/resources/test/help.stdout +++ b/crates/elp/src/resources/test/help.stdout @@ -1,8 +1,9 @@ -Usage: [--log-file LOG_FILE] [--erl ERL] [--no-log-buffering] [COMMAND ...] +Usage: [--log-file LOG_FILE] [--erl ERL] [--escript ESCRIPT] [--no-log-buffering] [COMMAND ...] Available options: --log-file --erl + --escript --no-log-buffering -h, --help Prints help information diff --git a/crates/erlang_service/src/lib.rs b/crates/erlang_service/src/lib.rs index 241a3297df..cac1852eaa 100644 --- a/crates/erlang_service/src/lib.rs +++ b/crates/erlang_service/src/lib.rs @@ -19,6 +19,7 @@ use std::process::ChildStdout; use std::process::Command; use std::process::Stdio; use std::sync::Arc; +use std::sync::RwLock; use std::time::Duration; use anyhow::anyhow; @@ -46,6 +47,10 @@ use text_size::TextRange; pub mod common_test; +lazy_static! { + pub static ref ESCRIPT: RwLock = RwLock::new("escript".to_string()); +} + #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] pub enum DiagnosticLocation { Normal(TextRange), @@ -324,7 +329,9 @@ impl Connection { let mut escript = Builder::new().prefix("erlang_service").tempfile()?; escript.write_all(escript_src)?; - let mut cmd = Command::new("escript"); + let escript_bin = ESCRIPT.read().unwrap(); + + let mut cmd = Command::new(&*escript_bin); cmd.arg(escript.path()); cmd.stdin(Stdio::piped())