diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-12-27 14:39:05 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2020-12-27 14:39:05 +0000 |
commit | 8f2622199e86ea0d4c8accf72c364ac8eddbf545 (patch) | |
tree | 60202937d17883cd862b1c788e6bde495a16dd2a /crates/proc_macro_api | |
parent | 0fd75c98ac81c9f6581712ec8802940e547315e3 (diff) | |
parent | 70877428a8d9f17834dee72f03ef80ce5c206e68 (diff) |
Merge #6820
6820: Pass the crate environment to proc macros r=jonas-schievink a=jonas-schievink
In theory, fixes https://github.com/rust-analyzer/rust-analyzer/issues/6696.
This seems to result in these obscure crashes for some reason:
```
thread '<unnamed>' panicked at 'called `Option::unwrap()` on a `None` value', /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/scoped_cell.rs:75:51
stack backtrace:
0: rust_begin_unwind
at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:483
1: core::panicking::panic_fmt
at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/panicking.rs:85
2: core::panicking::panic
at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/panicking.rs:50
3: core::option::Option<T>::unwrap
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs:383
4: proc_macro::bridge::scoped_cell::ScopedCell<T>::replace
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/scoped_cell.rs:75
5: proc_macro::bridge::client::BridgeState::with::{{closure}}
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/client.rs:291
6: std::thread::local::LocalKey<T>::try_with
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/thread/local.rs:272
7: std::thread::local::LocalKey<T>::with
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/thread/local.rs:248
8: proc_macro::bridge::client::BridgeState::with
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/client.rs:290
9: proc_macro::bridge::client::<impl proc_macro::bridge::Bridge>::with
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/client.rs:329
10: proc_macro::bridge::client::run_client::{{closure}}::{{closure}}
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/client.rs:375
11: proc_macro::bridge::scoped_cell::ScopedCell<T>::set::{{closure}}
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/scoped_cell.rs:80
12: proc_macro::bridge::scoped_cell::ScopedCell<T>::replace
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/scoped_cell.rs:75
13: proc_macro::bridge::scoped_cell::ScopedCell<T>::set
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/scoped_cell.rs:80
14: proc_macro::bridge::client::<impl proc_macro::bridge::Bridge>::enter::{{closure}}
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/client.rs:325
15: std::thread::local::LocalKey<T>::try_with
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/thread/local.rs:272
16: std::thread::local::LocalKey<T>::with
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/thread/local.rs:248
17: proc_macro::bridge::client::<impl proc_macro::bridge::Bridge>::enter
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/client.rs:325
18: proc_macro::bridge::client::run_client::{{closure}}
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/client.rs:370
19: <std::panic::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panic.rs:308
20: std::panicking::try::do_call
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:381
21: __rust_try
22: std::panicking::try
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:345
23: std::panic::catch_unwind
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panic.rs:382
24: proc_macro::bridge::client::run_client
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/client.rs:369
25: proc_macro::bridge::client::Client<fn(proc_macro::TokenStream) .> proc_macro::TokenStream>::expand1::run
at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/client.rs:410
26: proc_macro_srv::proc_macro::bridge::server::run_server
27: proc_macro_srv::dylib::Expander::expand
28: proc_macro_srv::ProcMacroSrv::expand
29: proc_macro_srv::cli::run
30: rust_analyzer::main
```
Co-authored-by: Jonas Schievink <[email protected]>
Diffstat (limited to 'crates/proc_macro_api')
-rw-r--r-- | crates/proc_macro_api/src/lib.rs | 8 | ||||
-rw-r--r-- | crates/proc_macro_api/src/rpc.rs | 4 |
2 files changed, 9 insertions, 3 deletions
diff --git a/crates/proc_macro_api/src/lib.rs b/crates/proc_macro_api/src/lib.rs index 0d061fd53..2ea456fb0 100644 --- a/crates/proc_macro_api/src/lib.rs +++ b/crates/proc_macro_api/src/lib.rs | |||
@@ -16,7 +16,7 @@ use std::{ | |||
16 | sync::Arc, | 16 | sync::Arc, |
17 | }; | 17 | }; |
18 | 18 | ||
19 | use base_db::ProcMacro; | 19 | use base_db::{Env, ProcMacro}; |
20 | use tt::{SmolStr, Subtree}; | 20 | use tt::{SmolStr, Subtree}; |
21 | 21 | ||
22 | use crate::process::{ProcMacroProcessSrv, ProcMacroProcessThread}; | 22 | use crate::process::{ProcMacroProcessSrv, ProcMacroProcessThread}; |
@@ -39,17 +39,19 @@ impl PartialEq for ProcMacroProcessExpander { | |||
39 | } | 39 | } |
40 | } | 40 | } |
41 | 41 | ||
42 | impl tt::TokenExpander for ProcMacroProcessExpander { | 42 | impl base_db::ProcMacroExpander for ProcMacroProcessExpander { |
43 | fn expand( | 43 | fn expand( |
44 | &self, | 44 | &self, |
45 | subtree: &Subtree, | 45 | subtree: &Subtree, |
46 | attr: Option<&Subtree>, | 46 | attr: Option<&Subtree>, |
47 | env: &Env, | ||
47 | ) -> Result<Subtree, tt::ExpansionError> { | 48 | ) -> Result<Subtree, tt::ExpansionError> { |
48 | let task = ExpansionTask { | 49 | let task = ExpansionTask { |
49 | macro_body: subtree.clone(), | 50 | macro_body: subtree.clone(), |
50 | macro_name: self.name.to_string(), | 51 | macro_name: self.name.to_string(), |
51 | attributes: attr.cloned(), | 52 | attributes: attr.cloned(), |
52 | lib: self.dylib_path.to_path_buf(), | 53 | lib: self.dylib_path.to_path_buf(), |
54 | env: env.iter().map(|(k, v)| (k.to_string(), v.to_string())).collect(), | ||
53 | }; | 55 | }; |
54 | 56 | ||
55 | let result: ExpansionResult = self.process.send_task(msg::Request::ExpansionMacro(task))?; | 57 | let result: ExpansionResult = self.process.send_task(msg::Request::ExpansionMacro(task))?; |
@@ -90,7 +92,7 @@ impl ProcMacroClient { | |||
90 | ProcMacroKind::FuncLike => base_db::ProcMacroKind::FuncLike, | 92 | ProcMacroKind::FuncLike => base_db::ProcMacroKind::FuncLike, |
91 | ProcMacroKind::Attr => base_db::ProcMacroKind::Attr, | 93 | ProcMacroKind::Attr => base_db::ProcMacroKind::Attr, |
92 | }; | 94 | }; |
93 | let expander: Arc<dyn tt::TokenExpander> = Arc::new(ProcMacroProcessExpander { | 95 | let expander = Arc::new(ProcMacroProcessExpander { |
94 | process: self.process.clone(), | 96 | process: self.process.clone(), |
95 | name: name.clone(), | 97 | name: name.clone(), |
96 | dylib_path: dylib_path.into(), | 98 | dylib_path: dylib_path.into(), |
diff --git a/crates/proc_macro_api/src/rpc.rs b/crates/proc_macro_api/src/rpc.rs index b85f92eea..cf830b59f 100644 --- a/crates/proc_macro_api/src/rpc.rs +++ b/crates/proc_macro_api/src/rpc.rs | |||
@@ -51,6 +51,9 @@ pub struct ExpansionTask { | |||
51 | pub attributes: Option<Subtree>, | 51 | pub attributes: Option<Subtree>, |
52 | 52 | ||
53 | pub lib: PathBuf, | 53 | pub lib: PathBuf, |
54 | |||
55 | /// Environment variables to set during macro expansion. | ||
56 | pub env: Vec<(String, String)>, | ||
54 | } | 57 | } |
55 | 58 | ||
56 | #[derive(Clone, Eq, PartialEq, Debug, Default, Serialize, Deserialize)] | 59 | #[derive(Clone, Eq, PartialEq, Debug, Default, Serialize, Deserialize)] |
@@ -251,6 +254,7 @@ mod tests { | |||
251 | macro_name: Default::default(), | 254 | macro_name: Default::default(), |
252 | attributes: None, | 255 | attributes: None, |
253 | lib: Default::default(), | 256 | lib: Default::default(), |
257 | env: Default::default(), | ||
254 | }; | 258 | }; |
255 | 259 | ||
256 | let json = serde_json::to_string(&task).unwrap(); | 260 | let json = serde_json::to_string(&task).unwrap(); |