mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-08-24 20:34:19 +00:00
Pass crate environment to proc macros
This commit is contained in:
parent
798968e1e3
commit
70877428a8
6 changed files with 42 additions and 9 deletions
|
@ -24,7 +24,7 @@ use proc_macro::bridge::client::TokenStream;
|
|||
use proc_macro_api::{ExpansionResult, ExpansionTask, ListMacrosResult, ListMacrosTask};
|
||||
use std::{
|
||||
collections::{hash_map::Entry, HashMap},
|
||||
fs,
|
||||
env, fs,
|
||||
path::{Path, PathBuf},
|
||||
time::SystemTime,
|
||||
};
|
||||
|
@ -37,7 +37,23 @@ pub(crate) struct ProcMacroSrv {
|
|||
impl ProcMacroSrv {
|
||||
pub fn expand(&mut self, task: &ExpansionTask) -> Result<ExpansionResult, String> {
|
||||
let expander = self.expander(&task.lib)?;
|
||||
match expander.expand(&task.macro_name, &task.macro_body, task.attributes.as_ref()) {
|
||||
|
||||
let mut prev_env = HashMap::new();
|
||||
for (k, v) in &task.env {
|
||||
prev_env.insert(k.as_str(), env::var_os(k));
|
||||
env::set_var(k, v);
|
||||
}
|
||||
|
||||
let result = expander.expand(&task.macro_name, &task.macro_body, task.attributes.as_ref());
|
||||
|
||||
for (k, _) in &task.env {
|
||||
match &prev_env[k.as_str()] {
|
||||
Some(v) => env::set_var(k, v),
|
||||
None => env::remove_var(k),
|
||||
}
|
||||
}
|
||||
|
||||
match result {
|
||||
Ok(expansion) => Ok(ExpansionResult { expansion }),
|
||||
Err(msg) => {
|
||||
let msg = msg.as_str().unwrap_or("<unknown error>");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue