Properly set the working directory for proc-macro execution

This commit is contained in:
Lukas Wirth 2024-09-11 12:23:12 +02:00
parent db04f514f2
commit c2258d8880
5 changed files with 29 additions and 5 deletions

View file

@ -320,6 +320,7 @@ impl ProcMacroExpander for IdentityWhenValidProcMacroExpander {
_: Span, _: Span,
_: Span, _: Span,
_: Span, _: Span,
_: Option<String>,
) -> Result<Subtree, ProcMacroExpansionError> { ) -> Result<Subtree, ProcMacroExpansionError> {
let (parse, _) = syntax_bridge::token_tree_to_syntax_node( let (parse, _) = syntax_bridge::token_tree_to_syntax_node(
subtree, subtree,

View file

@ -29,6 +29,7 @@ pub trait ProcMacroExpander: fmt::Debug + Send + Sync + RefUnwindSafe {
def_site: Span, def_site: Span,
call_site: Span, call_site: Span,
mixed_site: Span, mixed_site: Span,
current_dir: Option<String>,
) -> Result<tt::Subtree, ProcMacroExpansionError>; ) -> Result<tt::Subtree, ProcMacroExpansionError>;
} }
@ -234,8 +235,18 @@ impl CustomProcMacroExpander {
let krate_graph = db.crate_graph(); let krate_graph = db.crate_graph();
// Proc macros have access to the environment variables of the invoking crate. // Proc macros have access to the environment variables of the invoking crate.
let env = &krate_graph[calling_crate].env; 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), Ok(t) => ExpandResult::ok(t),
Err(err) => match err { Err(err) => match err {
// Don't discard the item in case something unexpected happened while expanding attributes // Don't discard the item in case something unexpected happened while expanding attributes

View file

@ -493,8 +493,17 @@ impl ProcMacroExpander for Expander {
def_site: Span, def_site: Span,
call_site: Span, call_site: Span,
mixed_site: Span, mixed_site: Span,
current_dir: Option<String>,
) -> Result<tt::Subtree<Span>, ProcMacroExpansionError> { ) -> 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(Ok(subtree)) => Ok(subtree),
Ok(Err(err)) => Err(ProcMacroExpansionError::Panic(err.0)), Ok(Err(err)) => Err(ProcMacroExpansionError::Panic(err.0)),
Err(err) => Err(ProcMacroExpansionError::System(err.to_string())), Err(err) => Err(ProcMacroExpansionError::System(err.to_string())),

View file

@ -152,10 +152,9 @@ impl ProcMacro {
def_site: Span, def_site: Span,
call_site: Span, call_site: Span,
mixed_site: Span, mixed_site: Span,
current_dir: Option<String>,
) -> Result<Result<tt::Subtree<Span>, PanicMessage>, ServerError> { ) -> Result<Result<tt::Subtree<Span>, PanicMessage>, ServerError> {
let version = self.process.version(); 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 mut span_data_table = SpanDataIndexMap::default();
let def_site = span_data_table.insert_full(def_site).0; let def_site = span_data_table.insert_full(def_site).0;

View file

@ -571,6 +571,7 @@ impl ProcMacroExpander for IdentityProcMacroExpander {
_: Span, _: Span,
_: Span, _: Span,
_: Span, _: Span,
_: Option<String>,
) -> Result<Subtree<Span>, ProcMacroExpansionError> { ) -> Result<Subtree<Span>, ProcMacroExpansionError> {
Ok(subtree.clone()) Ok(subtree.clone())
} }
@ -588,6 +589,7 @@ impl ProcMacroExpander for AttributeInputReplaceProcMacroExpander {
_: Span, _: Span,
_: Span, _: Span,
_: Span, _: Span,
_: Option<String>,
) -> Result<Subtree<Span>, ProcMacroExpansionError> { ) -> Result<Subtree<Span>, ProcMacroExpansionError> {
attrs attrs
.cloned() .cloned()
@ -606,6 +608,7 @@ impl ProcMacroExpander for MirrorProcMacroExpander {
_: Span, _: Span,
_: Span, _: Span,
_: Span, _: Span,
_: Option<String>,
) -> Result<Subtree<Span>, ProcMacroExpansionError> { ) -> Result<Subtree<Span>, ProcMacroExpansionError> {
fn traverse(input: &Subtree<Span>) -> Subtree<Span> { fn traverse(input: &Subtree<Span>) -> Subtree<Span> {
let mut token_trees = vec![]; let mut token_trees = vec![];
@ -636,6 +639,7 @@ impl ProcMacroExpander for ShortenProcMacroExpander {
_: Span, _: Span,
_: Span, _: Span,
_: Span, _: Span,
_: Option<String>,
) -> Result<Subtree<Span>, ProcMacroExpansionError> { ) -> Result<Subtree<Span>, ProcMacroExpansionError> {
return Ok(traverse(input)); return Ok(traverse(input));