aboutsummaryrefslogtreecommitdiff
path: root/crates/proc_macro_srv/src/proc_macro
diff options
context:
space:
mode:
authorLaurenČ›iu Nicola <[email protected]>2020-08-03 11:57:04 +0100
committerLaurenČ›iu Nicola <[email protected]>2020-10-08 15:06:20 +0100
commit3d169bd3f4cdc2dc3dd09eadbbc17c19214d69f3 (patch)
tree8e8d829f5926401ac8303001fb435b504311c203 /crates/proc_macro_srv/src/proc_macro
parente5f252ade72fee4776396122dc91a17ddc185a66 (diff)
Add track_env_var to the proc macro server
Diffstat (limited to 'crates/proc_macro_srv/src/proc_macro')
-rw-r--r--crates/proc_macro_srv/src/proc_macro/bridge/client.rs1
-rw-r--r--crates/proc_macro_srv/src/proc_macro/bridge/mod.rs4
-rw-r--r--crates/proc_macro_srv/src/proc_macro/bridge/server.rs2
-rw-r--r--crates/proc_macro_srv/src/proc_macro/mod.rs22
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}
161define_handles! { 161define_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;
57macro_rules! with_api { 57macro_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).
13macro_rules! associated_item { 13macro_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
928pub 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}