diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-10-08 15:27:30 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2020-10-08 15:27:30 +0100 |
commit | e6a05e6566014d95cec416b5203fdf52bb8ac09c (patch) | |
tree | 6a2b183ddbcf674c7503b5646548610ee223a470 | |
parent | e95e666b106b2f63ab2b350e656c9e8b96441fa7 (diff) | |
parent | 3d169bd3f4cdc2dc3dd09eadbbc17c19214d69f3 (diff) |
Merge #5651
5651: Add track_env_var to the proc macro server r=kjeremy a=lnicola
See https://github.com/rust-lang/rust/pull/74653.
Fixes #6054.
Fixes #5640, maybe.
Should be merged when 1.47 is released.
Proc macros still don't work for me, but it no longer crashes.
Co-authored-by: Laurențiu Nicola <[email protected]>
-rw-r--r-- | crates/proc_macro_srv/src/proc_macro/bridge/client.rs | 1 | ||||
-rw-r--r-- | crates/proc_macro_srv/src/proc_macro/bridge/mod.rs | 4 | ||||
-rw-r--r-- | crates/proc_macro_srv/src/proc_macro/bridge/server.rs | 2 | ||||
-rw-r--r-- | crates/proc_macro_srv/src/proc_macro/mod.rs | 22 | ||||
-rw-r--r-- | crates/proc_macro_srv/src/rustc_server.rs | 10 | ||||
-rw-r--r-- | xtask/src/install.rs | 2 |
6 files changed, 40 insertions, 1 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 | } | ||
diff --git a/crates/proc_macro_srv/src/rustc_server.rs b/crates/proc_macro_srv/src/rustc_server.rs index 7d1695c86..c5fe3591e 100644 --- a/crates/proc_macro_srv/src/rustc_server.rs +++ b/crates/proc_macro_srv/src/rustc_server.rs | |||
@@ -242,6 +242,8 @@ impl TokenStreamBuilder { | |||
242 | } | 242 | } |
243 | } | 243 | } |
244 | 244 | ||
245 | pub struct FreeFunctions; | ||
246 | |||
245 | #[derive(Clone)] | 247 | #[derive(Clone)] |
246 | pub struct TokenStreamIter { | 248 | pub struct TokenStreamIter { |
247 | trees: IntoIter<TokenTree>, | 249 | trees: IntoIter<TokenTree>, |
@@ -254,6 +256,7 @@ pub struct Rustc { | |||
254 | } | 256 | } |
255 | 257 | ||
256 | impl server::Types for Rustc { | 258 | impl server::Types for Rustc { |
259 | type FreeFunctions = FreeFunctions; | ||
257 | type TokenStream = TokenStream; | 260 | type TokenStream = TokenStream; |
258 | type TokenStreamBuilder = TokenStreamBuilder; | 261 | type TokenStreamBuilder = TokenStreamBuilder; |
259 | type TokenStreamIter = TokenStreamIter; | 262 | type TokenStreamIter = TokenStreamIter; |
@@ -267,6 +270,13 @@ impl server::Types for Rustc { | |||
267 | type MultiSpan = Vec<Span>; | 270 | type MultiSpan = Vec<Span>; |
268 | } | 271 | } |
269 | 272 | ||
273 | impl server::FreeFunctions for Rustc { | ||
274 | fn track_env_var(&mut self, _var: &str, _value: Option<&str>) { | ||
275 | // FIXME: track env var accesses | ||
276 | // https://github.com/rust-lang/rust/pull/71858 | ||
277 | } | ||
278 | } | ||
279 | |||
270 | impl server::TokenStream for Rustc { | 280 | impl server::TokenStream for Rustc { |
271 | fn new(&mut self) -> Self::TokenStream { | 281 | fn new(&mut self) -> Self::TokenStream { |
272 | Self::TokenStream::new() | 282 | Self::TokenStream::new() |
diff --git a/xtask/src/install.rs b/xtask/src/install.rs index d829790d7..fcc4f05e4 100644 --- a/xtask/src/install.rs +++ b/xtask/src/install.rs | |||
@@ -7,7 +7,7 @@ use anyhow::{bail, format_err, Context, Result}; | |||
7 | use crate::not_bash::{pushd, run}; | 7 | use crate::not_bash::{pushd, run}; |
8 | 8 | ||
9 | // Latest stable, feel free to send a PR if this lags behind. | 9 | // Latest stable, feel free to send a PR if this lags behind. |
10 | const REQUIRED_RUST_VERSION: u32 = 46; | 10 | const REQUIRED_RUST_VERSION: u32 = 47; |
11 | 11 | ||
12 | pub struct InstallCmd { | 12 | pub struct InstallCmd { |
13 | pub client: Option<ClientOpt>, | 13 | pub client: Option<ClientOpt>, |