File tree 6 files changed +56
-1
lines changed
compiler/rustc_expand/src
src/tools/rust-analyzer/crates/proc-macro-srv/src
6 files changed +56
-1
lines changed Original file line number Diff line number Diff line change @@ -426,6 +426,10 @@ impl server::Types for Rustc<'_, '_> {
426
426
}
427
427
428
428
impl server:: FreeFunctions for Rustc < ' _ , ' _ > {
429
+ fn injected_env_var ( & mut self , var : & str ) -> Option < String > {
430
+ self . ecx . sess . opts . logical_env . get ( var) . cloned ( )
431
+ }
432
+
429
433
fn track_env_var ( & mut self , var : & str , value : Option < & str > ) {
430
434
self . sess ( )
431
435
. env_depinfo
Original file line number Diff line number Diff line change @@ -55,6 +55,7 @@ macro_rules! with_api {
55
55
$m! {
56
56
FreeFunctions {
57
57
fn drop( $self: $S:: FreeFunctions ) ;
58
+ fn injected_env_var( var: & str ) -> Option <String >;
58
59
fn track_env_var( var: & str , value: Option <& str >) ;
59
60
fn track_path( path: & str ) ;
60
61
fn literal_from_str( s: & str ) -> Result <Literal <$S:: Span , $S:: Symbol >, ( ) >;
Original file line number Diff line number Diff line change @@ -1503,7 +1503,8 @@ pub mod tracked_env {
1503
1503
#[ unstable( feature = "proc_macro_tracked_env" , issue = "99515" ) ]
1504
1504
pub fn var < K : AsRef < OsStr > + AsRef < str > > ( key : K ) -> Result < String , VarError > {
1505
1505
let key: & str = key. as_ref ( ) ;
1506
- let value = env:: var ( key) ;
1506
+ let value = crate :: bridge:: client:: FreeFunctions :: injected_env_var ( key)
1507
+ . map_or_else ( || env:: var ( key) , Ok ) ;
1507
1508
crate :: bridge:: client:: FreeFunctions :: track_env_var ( key, value. as_deref ( ) . ok ( ) ) ;
1508
1509
value
1509
1510
}
Original file line number Diff line number Diff line change @@ -58,6 +58,10 @@ impl server::Types for RustAnalyzer {
58
58
}
59
59
60
60
impl server:: FreeFunctions for RustAnalyzer {
61
+ fn injected_env_var ( & mut self , _var : & str ) -> Option < String > {
62
+ None
63
+ }
64
+
61
65
fn track_env_var ( & mut self , _var : & str , _value : Option < & str > ) {
62
66
// FIXME: track env var accesses
63
67
// https://github.com/rust-lang/rust/pull/71858
Original file line number Diff line number Diff line change
1
+ // force-host
2
+ // no-prefer-dynamic
3
+
4
+ #![ crate_type = "proc-macro" ]
5
+ #![ feature( proc_macro_tracked_env) ]
6
+
7
+ extern crate proc_macro;
8
+
9
+ use proc_macro:: TokenStream ;
10
+ use proc_macro:: tracked_env:: var;
11
+
12
+ #[ proc_macro]
13
+ pub fn generate_const ( input : TokenStream ) -> TokenStream {
14
+ let the_const = match var ( "THE_CONST" ) {
15
+ Ok ( x) if x == "12" => {
16
+ "const THE_CONST: u32 = 12;"
17
+ }
18
+ _ => {
19
+ "const THE_CONST: u32 = 0;"
20
+ }
21
+ } ;
22
+ let another = if var ( "ANOTHER" ) . is_ok ( ) {
23
+ "const ANOTHER: u32 = 1;"
24
+ } else {
25
+ "const ANOTHER: u32 = 2;"
26
+ } ;
27
+ format ! ( "{the_const}{another}" ) . parse ( ) . unwrap ( )
28
+ }
Original file line number Diff line number Diff line change
1
+ // aux-build:env.rs
2
+ // run-pass
3
+ // rustc-env: THE_CONST=1
4
+ // compile-flags: -Zunstable-options --env THE_CONST=12 --env ANOTHER=4
5
+
6
+ #![ crate_name = "foo" ]
7
+
8
+ extern crate env;
9
+
10
+ use env:: generate_const;
11
+
12
+ generate_const ! ( ) ;
13
+
14
+ fn main ( ) {
15
+ assert_eq ! ( THE_CONST , 12 ) ;
16
+ assert_eq ! ( ANOTHER , 1 ) ;
17
+ }
You can’t perform that action at this time.
0 commit comments