mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-13 13:48:50 +00:00
Properly set the working directory for proc-macro execution
This commit is contained in:
parent
db04f514f2
commit
c2258d8880
5 changed files with 29 additions and 5 deletions
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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())),
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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));
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue