Skip to content

Commit

Permalink
Merge #5651
Browse files Browse the repository at this point in the history
5651: Add track_env_var to the proc macro server r=kjeremy a=lnicola

See rust-lang/rust#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]>
  • Loading branch information
bors[bot] and lnicola authored Oct 8, 2020
2 parents e95e666 + 3d169bd commit e6a05e6
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 1 deletion.
1 change: 1 addition & 0 deletions crates/proc_macro_srv/src/proc_macro/bridge/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ macro_rules! define_handles {
}
define_handles! {
'owned:
FreeFunctions,
TokenStream,
TokenStreamBuilder,
TokenStreamIter,
Expand Down
4 changes: 4 additions & 0 deletions crates/proc_macro_srv/src/proc_macro/bridge/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ use std::thread;
macro_rules! with_api {
($S:ident, $self:ident, $m:ident) => {
$m! {
FreeFunctions {
fn drop($self: $S::FreeFunctions);
fn track_env_var(var: &str, value: Option<&str>);
},
TokenStream {
fn drop($self: $S::TokenStream);
fn clone($self: &$S::TokenStream) -> $S::TokenStream;
Expand Down
2 changes: 2 additions & 0 deletions crates/proc_macro_srv/src/proc_macro/bridge/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ use super::client::HandleStore;
/// Declare an associated item of one of the traits below, optionally
/// adjusting it (i.e., adding bounds to types and default bodies to methods).
macro_rules! associated_item {
(type FreeFunctions) =>
(type FreeFunctions: 'static;);
(type TokenStream) =>
(type TokenStream: 'static + Clone;);
(type TokenStreamBuilder) =>
Expand Down
22 changes: 22 additions & 0 deletions crates/proc_macro_srv/src/proc_macro/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -924,3 +924,25 @@ impl fmt::Debug for Literal {
self.0.fmt(f)
}
}

pub mod tracked_env {
use std::env::{self, VarError};
use std::ffi::OsStr;

/// Retrieve an environment variable and add it to build dependency info.
/// Build system executing the compiler will know that the variable was accessed during
/// compilation, and will be able to rerun the build when the value of that variable changes.
/// Besides the dependency tracking this function should be equivalent to `env::var` from the
/// standard library, except that the argument must be UTF-8.
pub fn var<K: AsRef<OsStr> + AsRef<str>>(key: K) -> Result<String, VarError> {
use std::ops::Deref;

let key: &str = key.as_ref();
let value = env::var(key);
super::bridge::client::FreeFunctions::track_env_var(
key,
value.as_ref().map(|t| t.deref()).ok(),
);
value
}
}
10 changes: 10 additions & 0 deletions crates/proc_macro_srv/src/rustc_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,8 @@ impl TokenStreamBuilder {
}
}

pub struct FreeFunctions;

#[derive(Clone)]
pub struct TokenStreamIter {
trees: IntoIter<TokenTree>,
Expand All @@ -254,6 +256,7 @@ pub struct Rustc {
}

impl server::Types for Rustc {
type FreeFunctions = FreeFunctions;
type TokenStream = TokenStream;
type TokenStreamBuilder = TokenStreamBuilder;
type TokenStreamIter = TokenStreamIter;
Expand All @@ -267,6 +270,13 @@ impl server::Types for Rustc {
type MultiSpan = Vec<Span>;
}

impl server::FreeFunctions for Rustc {
fn track_env_var(&mut self, _var: &str, _value: Option<&str>) {
// FIXME: track env var accesses
// https://github.com/rust-lang/rust/pull/71858
}
}

impl server::TokenStream for Rustc {
fn new(&mut self) -> Self::TokenStream {
Self::TokenStream::new()
Expand Down
2 changes: 1 addition & 1 deletion xtask/src/install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use anyhow::{bail, format_err, Context, Result};
use crate::not_bash::{pushd, run};

// Latest stable, feel free to send a PR if this lags behind.
const REQUIRED_RUST_VERSION: u32 = 46;
const REQUIRED_RUST_VERSION: u32 = 47;

pub struct InstallCmd {
pub client: Option<ClientOpt>,
Expand Down

0 comments on commit e6a05e6

Please sign in to comment.