@@ -15,7 +15,7 @@ use rustc_span::symbol::{Ident, Symbol, kw, sym};
15
15
use thin_vec:: thin_vec;
16
16
17
17
use crate :: errors;
18
- use crate :: util:: { expr_to_string, get_exprs_from_tts, get_single_str_from_tts } ;
18
+ use crate :: util:: { expr_to_string, get_exprs_from_tts, get_single_expr_from_tts } ;
19
19
20
20
fn lookup_env < ' cx > ( cx : & ' cx ExtCtxt < ' _ > , var : Symbol ) -> Result < Symbol , VarError > {
21
21
let var = var. as_str ( ) ;
@@ -32,19 +32,28 @@ pub(crate) fn expand_option_env<'cx>(
32
32
sp : Span ,
33
33
tts : TokenStream ,
34
34
) -> MacroExpanderResult < ' cx > {
35
- let ExpandResult :: Ready ( mac) = get_single_str_from_tts ( cx, sp, tts, "option_env!" ) else {
35
+ let ExpandResult :: Ready ( mac_expr) = get_single_expr_from_tts ( cx, sp, tts, "option_env!" ) else {
36
+ return ExpandResult :: Retry ( ( ) ) ;
37
+ } ;
38
+ let var_expr = match mac_expr {
39
+ Ok ( var_expr) => var_expr,
40
+ Err ( guar) => return ExpandResult :: Ready ( DummyResult :: any ( sp, guar) ) ,
41
+ } ;
42
+ let ExpandResult :: Ready ( mac) =
43
+ expr_to_string ( cx, var_expr. clone ( ) , "argument must be a string literal" )
44
+ else {
36
45
return ExpandResult :: Retry ( ( ) ) ;
37
46
} ;
38
47
let var = match mac {
39
- Ok ( var) => var,
48
+ Ok ( ( var, _ ) ) => var,
40
49
Err ( guar) => return ExpandResult :: Ready ( DummyResult :: any ( sp, guar) ) ,
41
50
} ;
42
51
43
52
let sp = cx. with_def_site_ctxt ( sp) ;
44
- let value = lookup_env ( cx, var) . ok ( ) ;
45
- cx. sess . psess . env_depinfo . borrow_mut ( ) . insert ( ( var, value) ) ;
53
+ let value = lookup_env ( cx, var) ;
54
+ cx. sess . psess . env_depinfo . borrow_mut ( ) . insert ( ( var, value. as_ref ( ) . ok ( ) . copied ( ) ) ) ;
46
55
let e = match value {
47
- None => {
56
+ Err ( VarError :: NotPresent ) => {
48
57
let lt = cx. lifetime ( sp, Ident :: new ( kw:: StaticLifetime , sp) ) ;
49
58
cx. expr_path ( cx. path_all (
50
59
sp,
@@ -58,7 +67,18 @@ pub(crate) fn expand_option_env<'cx>(
58
67
) ) ] ,
59
68
) )
60
69
}
61
- Some ( value) => {
70
+ Err ( VarError :: NotUnicode ( _) ) => {
71
+ let ExprKind :: Lit ( token:: Lit {
72
+ kind : LitKind :: Str | LitKind :: StrRaw ( ..) , symbol, ..
73
+ } ) = & var_expr. kind
74
+ else {
75
+ unreachable ! ( "`expr_to_string` ensures this is a string lit" )
76
+ } ;
77
+
78
+ let guar = cx. dcx ( ) . emit_err ( errors:: EnvNotUnicode { span : sp, var : * symbol } ) ;
79
+ return ExpandResult :: Ready ( DummyResult :: any ( sp, guar) ) ;
80
+ }
81
+ Ok ( value) => {
62
82
cx. expr_call_global ( sp, cx. std_path ( & [ sym:: option, sym:: Option , sym:: Some ] ) , thin_vec ! [
63
83
cx. expr_str( sp, value)
64
84
] )
0 commit comments