diff options
Diffstat (limited to 'crates/proc_macro_srv/src/proc_macro')
4 files changed, 29 insertions, 0 deletions
diff --git a/crates/proc_macro_srv/src/proc_macro/bridge/client.rs b/crates/proc_macro_srv/src/proc_macro/bridge/client.rs index cb4b3bdb0..55d6330cc 100644 --- a/crates/proc_macro_srv/src/proc_macro/bridge/client.rs +++ b/crates/proc_macro_srv/src/proc_macro/bridge/client.rs | |||
@@ -160,6 +160,7 @@ macro_rules! define_handles { | |||
160 | } | 160 | } |
161 | define_handles! { | 161 | define_handles! { |
162 | 'owned: | 162 | 'owned: |
163 | FreeFunctions, | ||
163 | TokenStream, | 164 | TokenStream, |
164 | TokenStreamBuilder, | 165 | TokenStreamBuilder, |
165 | TokenStreamIter, | 166 | TokenStreamIter, |
diff --git a/crates/proc_macro_srv/src/proc_macro/bridge/mod.rs b/crates/proc_macro_srv/src/proc_macro/bridge/mod.rs index aeb05aad4..b97886eb9 100644 --- a/crates/proc_macro_srv/src/proc_macro/bridge/mod.rs +++ b/crates/proc_macro_srv/src/proc_macro/bridge/mod.rs | |||
@@ -57,6 +57,10 @@ use std::thread; | |||
57 | macro_rules! with_api { | 57 | macro_rules! with_api { |
58 | ($S:ident, $self:ident, $m:ident) => { | 58 | ($S:ident, $self:ident, $m:ident) => { |
59 | $m! { | 59 | $m! { |
60 | FreeFunctions { | ||
61 | fn drop($self: $S::FreeFunctions); | ||
62 | fn track_env_var(var: &str, value: Option<&str>); | ||
63 | }, | ||
60 | TokenStream { | 64 | TokenStream { |
61 | fn drop($self: $S::TokenStream); | 65 | fn drop($self: $S::TokenStream); |
62 | fn clone($self: &$S::TokenStream) -> $S::TokenStream; | 66 | fn clone($self: &$S::TokenStream) -> $S::TokenStream; |
diff --git a/crates/proc_macro_srv/src/proc_macro/bridge/server.rs b/crates/proc_macro_srv/src/proc_macro/bridge/server.rs index 45d41ac02..3acb239af 100644 --- a/crates/proc_macro_srv/src/proc_macro/bridge/server.rs +++ b/crates/proc_macro_srv/src/proc_macro/bridge/server.rs | |||
@@ -11,6 +11,8 @@ use super::client::HandleStore; | |||
11 | /// Declare an associated item of one of the traits below, optionally | 11 | /// Declare an associated item of one of the traits below, optionally |
12 | /// adjusting it (i.e., adding bounds to types and default bodies to methods). | 12 | /// adjusting it (i.e., adding bounds to types and default bodies to methods). |
13 | macro_rules! associated_item { | 13 | macro_rules! associated_item { |
14 | (type FreeFunctions) => | ||
15 | (type FreeFunctions: 'static;); | ||
14 | (type TokenStream) => | 16 | (type TokenStream) => |
15 | (type TokenStream: 'static + Clone;); | 17 | (type TokenStream: 'static + Clone;); |
16 | (type TokenStreamBuilder) => | 18 | (type TokenStreamBuilder) => |
diff --git a/crates/proc_macro_srv/src/proc_macro/mod.rs b/crates/proc_macro_srv/src/proc_macro/mod.rs index ee0dc9722..fc6e7344f 100644 --- a/crates/proc_macro_srv/src/proc_macro/mod.rs +++ b/crates/proc_macro_srv/src/proc_macro/mod.rs | |||
@@ -924,3 +924,25 @@ impl fmt::Debug for Literal { | |||
924 | self.0.fmt(f) | 924 | self.0.fmt(f) |
925 | } | 925 | } |
926 | } | 926 | } |
927 | |||
928 | pub mod tracked_env { | ||
929 | use std::env::{self, VarError}; | ||
930 | use std::ffi::OsStr; | ||
931 | |||
932 | /// Retrieve an environment variable and add it to build dependency info. | ||
933 | /// Build system executing the compiler will know that the variable was accessed during | ||
934 | /// compilation, and will be able to rerun the build when the value of that variable changes. | ||
935 | /// Besides the dependency tracking this function should be equivalent to `env::var` from the | ||
936 | /// standard library, except that the argument must be UTF-8. | ||
937 | pub fn var<K: AsRef<OsStr> + AsRef<str>>(key: K) -> Result<String, VarError> { | ||
938 | use std::ops::Deref; | ||
939 | |||
940 | let key: &str = key.as_ref(); | ||
941 | let value = env::var(key); | ||
942 | super::bridge::client::FreeFunctions::track_env_var( | ||
943 | key, | ||
944 | value.as_ref().map(|t| t.deref()).ok(), | ||
945 | ); | ||
946 | value | ||
947 | } | ||
948 | } | ||