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