File tree Expand file tree Collapse file tree 5 files changed +39
-0
lines changed
crates/proc_macro_srv/src Expand file tree Collapse file tree 5 files changed +39
-0
lines changed Original file line number Diff line number Diff line change @@ -160,6 +160,7 @@ macro_rules! define_handles {
160160}
161161define_handles ! {
162162 ' owned:
163+ FreeFunctions ,
163164 TokenStream ,
164165 TokenStreamBuilder ,
165166 TokenStreamIter ,
Original file line number Diff line number Diff line change @@ -57,6 +57,10 @@ use std::thread;
5757macro_rules! with_api {
5858 ( $S: ident, $self: ident, $m: ident) => {
5959 $m! {
60+ FreeFunctions {
61+ fn drop( $self: $S:: FreeFunctions ) ;
62+ fn track_env_var( var: & str , value: Option <& str >) ;
63+ } ,
6064 TokenStream {
6165 fn drop( $self: $S:: TokenStream ) ;
6266 fn clone( $self: & $S:: TokenStream ) -> $S:: TokenStream ;
Original file line number Diff line number Diff line change @@ -11,6 +11,8 @@ use super::client::HandleStore;
1111/// Declare an associated item of one of the traits below, optionally
1212/// adjusting it (i.e., adding bounds to types and default bodies to methods).
1313macro_rules! associated_item {
14+ ( type FreeFunctions ) =>
15+ ( type FreeFunctions : ' static ; ) ;
1416 ( type TokenStream ) =>
1517 ( type TokenStream : ' static + Clone ; ) ;
1618 ( type TokenStreamBuilder ) =>
Original file line number Diff line number Diff line change @@ -924,3 +924,25 @@ impl fmt::Debug for Literal {
924924 self . 0 . fmt ( f)
925925 }
926926}
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+ }
Original file line number Diff line number Diff line change @@ -242,6 +242,8 @@ impl TokenStreamBuilder {
242242 }
243243}
244244
245+ pub struct FreeFunctions ;
246+
245247#[ derive( Clone ) ]
246248pub struct TokenStreamIter {
247249 trees : IntoIter < TokenTree > ,
@@ -254,6 +256,7 @@ pub struct Rustc {
254256}
255257
256258impl server:: Types for Rustc {
259+ type FreeFunctions = FreeFunctions ;
257260 type TokenStream = TokenStream ;
258261 type TokenStreamBuilder = TokenStreamBuilder ;
259262 type TokenStreamIter = TokenStreamIter ;
@@ -267,6 +270,13 @@ impl server::Types for Rustc {
267270 type MultiSpan = Vec < Span > ;
268271}
269272
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+
270280impl server:: TokenStream for Rustc {
271281 fn new ( & mut self ) -> Self :: TokenStream {
272282 Self :: TokenStream :: new ( )
You can’t perform that action at this time.
0 commit comments