Unnamed repository; edit this file 'description' to name the repository.
Properly set the working directory for proc-macro execution
Lukas Wirth 2024-09-11
parent db04f51 · commit c2258d8
-rw-r--r--crates/hir-def/src/macro_expansion_tests/mod.rs1
-rw-r--r--crates/hir-expand/src/proc_macro.rs15
-rw-r--r--crates/load-cargo/src/lib.rs11
-rw-r--r--crates/proc-macro-api/src/lib.rs3
-rw-r--r--crates/test-fixture/src/lib.rs4
5 files changed, 29 insertions, 5 deletions
diff --git a/crates/hir-def/src/macro_expansion_tests/mod.rs b/crates/hir-def/src/macro_expansion_tests/mod.rs
index f9ccb06ce8..450a15bd66 100644
--- a/crates/hir-def/src/macro_expansion_tests/mod.rs
+++ b/crates/hir-def/src/macro_expansion_tests/mod.rs
@@ -320,6 +320,7 @@ impl ProcMacroExpander for IdentityWhenValidProcMacroExpander {
_: Span,
_: Span,
_: Span,
+ _: Option<String>,
) -> Result<Subtree, ProcMacroExpansionError> {
let (parse, _) = syntax_bridge::token_tree_to_syntax_node(
subtree,
diff --git a/crates/hir-expand/src/proc_macro.rs b/crates/hir-expand/src/proc_macro.rs
index 26bb3a3edd..fe09f0307c 100644
--- a/crates/hir-expand/src/proc_macro.rs
+++ b/crates/hir-expand/src/proc_macro.rs
@@ -29,6 +29,7 @@ pub trait ProcMacroExpander: fmt::Debug + Send + Sync + RefUnwindSafe {
def_site: Span,
call_site: Span,
mixed_site: Span,
+ current_dir: Option<String>,
) -> Result<tt::Subtree, ProcMacroExpansionError>;
}
@@ -234,8 +235,18 @@ impl CustomProcMacroExpander {
let krate_graph = db.crate_graph();
// Proc macros have access to the environment variables of the invoking crate.
let env = &krate_graph[calling_crate].env;
- match proc_macro.expander.expand(tt, attr_arg, env, def_site, call_site, mixed_site)
- {
+ match proc_macro.expander.expand(
+ tt,
+ attr_arg,
+ env,
+ def_site,
+ call_site,
+ mixed_site,
+ db.crate_workspace_data()[&calling_crate]
+ .proc_macro_cwd
+ .as_ref()
+ .map(ToString::to_string),
+ ) {
Ok(t) => ExpandResult::ok(t),
Err(err) => match err {
// Don't discard the item in case something unexpected happened while expanding attributes
diff --git a/crates/load-cargo/src/lib.rs b/crates/load-cargo/src/lib.rs
index e9bc87833f..baa4517423 100644
--- a/crates/load-cargo/src/lib.rs
+++ b/crates/load-cargo/src/lib.rs
@@ -493,8 +493,17 @@ impl ProcMacroExpander for Expander {
def_site: Span,
call_site: Span,
mixed_site: Span,
+ current_dir: Option<String>,
) -> Result<tt::Subtree<Span>, ProcMacroExpansionError> {
- match self.0.expand(subtree, attrs, env.clone(), def_site, call_site, mixed_site) {
+ match self.0.expand(
+ subtree,
+ attrs,
+ env.clone(),
+ def_site,
+ call_site,
+ mixed_site,
+ current_dir,
+ ) {
Ok(Ok(subtree)) => Ok(subtree),
Ok(Err(err)) => Err(ProcMacroExpansionError::Panic(err.0)),
Err(err) => Err(ProcMacroExpansionError::System(err.to_string())),
diff --git a/crates/proc-macro-api/src/lib.rs b/crates/proc-macro-api/src/lib.rs
index d50a3cdbf7..011baad65f 100644
--- a/crates/proc-macro-api/src/lib.rs
+++ b/crates/proc-macro-api/src/lib.rs
@@ -152,10 +152,9 @@ impl ProcMacro {
def_site: Span,
call_site: Span,
mixed_site: Span,
+ current_dir: Option<String>,
) -> Result<Result<tt::Subtree<Span>, PanicMessage>, ServerError> {
let version = self.process.version();
- let current_dir =
- env.get("CARGO_RUSTC_CURRENT_DIR").or_else(|| env.get("CARGO_MANIFEST_DIR"));
let mut span_data_table = SpanDataIndexMap::default();
let def_site = span_data_table.insert_full(def_site).0;
diff --git a/crates/test-fixture/src/lib.rs b/crates/test-fixture/src/lib.rs
index bbc109e881..3443f1f900 100644
--- a/crates/test-fixture/src/lib.rs
+++ b/crates/test-fixture/src/lib.rs
@@ -571,6 +571,7 @@ impl ProcMacroExpander for IdentityProcMacroExpander {
_: Span,
_: Span,
_: Span,
+ _: Option<String>,
) -> Result<Subtree<Span>, ProcMacroExpansionError> {
Ok(subtree.clone())
}
@@ -588,6 +589,7 @@ impl ProcMacroExpander for AttributeInputReplaceProcMacroExpander {
_: Span,
_: Span,
_: Span,
+ _: Option<String>,
) -> Result<Subtree<Span>, ProcMacroExpansionError> {
attrs
.cloned()
@@ -606,6 +608,7 @@ impl ProcMacroExpander for MirrorProcMacroExpander {
_: Span,
_: Span,
_: Span,
+ _: Option<String>,
) -> Result<Subtree<Span>, ProcMacroExpansionError> {
fn traverse(input: &Subtree<Span>) -> Subtree<Span> {
let mut token_trees = vec![];
@@ -636,6 +639,7 @@ impl ProcMacroExpander for ShortenProcMacroExpander {
_: Span,
_: Span,
_: Span,
+ _: Option<String>,
) -> Result<Subtree<Span>, ProcMacroExpansionError> {
return Ok(traverse(input));