mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-11-01 04:18:20 +00:00
allow using null to unset an environment variable
this makes three changes: - all callsites of `toolchain::command` are changed to use `command(path, extra_env)`, instead of manually adding the env after the fact. - all `map<str, str>` are changed to `map<str, option<str>>`. - `command` checks for None and calls `env_remove` if so. this caught several places where environment variables weren't being propagated: - when running `rustc --print=target-libdir` - when running `cargo rustc -- --print=target-spec-json` - when running the custom DiscoverLinkedProjects config. I *think* this is for use with non-cargo build systems, so I didn't change it.
This commit is contained in:
parent
a09a5502c3
commit
3b964a7105
19 changed files with 114 additions and 91 deletions
|
|
@ -105,10 +105,11 @@ impl fmt::Display for ServerError {
|
|||
|
||||
impl ProcMacroClient {
|
||||
/// Spawns an external process as the proc macro server and returns a client connected to it.
|
||||
pub fn spawn(
|
||||
pub fn spawn<'a>(
|
||||
process_path: &AbsPath,
|
||||
env: impl IntoIterator<Item = (impl AsRef<std::ffi::OsStr>, impl AsRef<std::ffi::OsStr>)>
|
||||
+ Clone,
|
||||
env: impl IntoIterator<
|
||||
Item = (impl AsRef<std::ffi::OsStr>, &'a Option<impl 'a + AsRef<std::ffi::OsStr>>),
|
||||
> + Clone,
|
||||
) -> io::Result<ProcMacroClient> {
|
||||
let process = ProcMacroServerProcess::run(process_path, env)?;
|
||||
Ok(ProcMacroClient { process: Arc::new(process), path: process_path.to_owned() })
|
||||
|
|
|
|||
|
|
@ -43,10 +43,11 @@ struct ProcessSrvState {
|
|||
|
||||
impl ProcMacroServerProcess {
|
||||
/// Starts the proc-macro server and performs a version check
|
||||
pub(crate) fn run(
|
||||
pub(crate) fn run<'a>(
|
||||
process_path: &AbsPath,
|
||||
env: impl IntoIterator<Item = (impl AsRef<std::ffi::OsStr>, impl AsRef<std::ffi::OsStr>)>
|
||||
+ Clone,
|
||||
env: impl IntoIterator<
|
||||
Item = (impl AsRef<std::ffi::OsStr>, &'a Option<impl 'a + AsRef<std::ffi::OsStr>>),
|
||||
> + Clone,
|
||||
) -> io::Result<ProcMacroServerProcess> {
|
||||
let create_srv = || {
|
||||
let mut process = Process::run(process_path, env.clone())?;
|
||||
|
|
@ -193,9 +194,11 @@ struct Process {
|
|||
|
||||
impl Process {
|
||||
/// Runs a new proc-macro server process with the specified environment variables.
|
||||
fn run(
|
||||
fn run<'a>(
|
||||
path: &AbsPath,
|
||||
env: impl IntoIterator<Item = (impl AsRef<std::ffi::OsStr>, impl AsRef<std::ffi::OsStr>)>,
|
||||
env: impl IntoIterator<
|
||||
Item = (impl AsRef<std::ffi::OsStr>, &'a Option<impl 'a + AsRef<std::ffi::OsStr>>),
|
||||
>,
|
||||
) -> io::Result<Process> {
|
||||
let child = JodChild(mk_child(path, env)?);
|
||||
Ok(Process { child })
|
||||
|
|
@ -212,14 +215,21 @@ impl Process {
|
|||
}
|
||||
|
||||
/// Creates and configures a new child process for the proc-macro server.
|
||||
fn mk_child(
|
||||
fn mk_child<'a>(
|
||||
path: &AbsPath,
|
||||
env: impl IntoIterator<Item = (impl AsRef<std::ffi::OsStr>, impl AsRef<std::ffi::OsStr>)>,
|
||||
extra_env: impl IntoIterator<
|
||||
Item = (impl AsRef<std::ffi::OsStr>, &'a Option<impl 'a + AsRef<std::ffi::OsStr>>),
|
||||
>,
|
||||
) -> io::Result<Child> {
|
||||
#[allow(clippy::disallowed_methods)]
|
||||
let mut cmd = Command::new(path);
|
||||
cmd.envs(env)
|
||||
.env("RUST_ANALYZER_INTERNALS_DO_NOT_USE", "this is unstable")
|
||||
for env in extra_env {
|
||||
match env {
|
||||
(key, Some(val)) => cmd.env(key, val),
|
||||
(key, None) => cmd.env_remove(key),
|
||||
};
|
||||
}
|
||||
cmd.env("RUST_ANALYZER_INTERNALS_DO_NOT_USE", "this is unstable")
|
||||
.stdin(Stdio::piped())
|
||||
.stdout(Stdio::piped())
|
||||
.stderr(Stdio::inherit());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue