22//! a literal `true` or `false` based on whether the given cfg matches the
33//! current compilation environment.
44
5- use rustc_ast:: token;
65use rustc_ast:: tokenstream:: TokenStream ;
7- use rustc_errors:: PResult ;
6+ use rustc_ast:: { AttrStyle , CRATE_NODE_ID , token} ;
7+ use rustc_attr_parsing as attr;
8+ use rustc_attr_parsing:: parser:: MetaItemOrLitParser ;
9+ use rustc_attr_parsing:: { AttributeParser , CFG_TEMPLATE , ShouldEmit , parse_cfg_entry} ;
810use rustc_expand:: base:: { DummyResult , ExpandResult , ExtCtxt , MacEager , MacroExpanderResult } ;
11+ use rustc_hir:: AttrPath ;
12+ use rustc_hir:: attrs:: CfgEntry ;
913use rustc_parse:: exp;
10- use rustc_span:: Span ;
11- use { rustc_ast as ast, rustc_attr_parsing as attr} ;
14+ use rustc_span:: { ErrorGuaranteed , Ident , Span } ;
1215
1316use crate :: errors;
1417
@@ -21,38 +24,48 @@ pub(crate) fn expand_cfg(
2124
2225 ExpandResult :: Ready ( match parse_cfg ( cx, sp, tts) {
2326 Ok ( cfg) => {
24- let matches_cfg = attr:: cfg_matches (
27+ let matches_cfg = attr:: eval_config_entry (
28+ cx. sess ,
2529 & cfg,
26- & cx. sess ,
2730 cx. current_expansion . lint_node_id ,
2831 Some ( cx. ecfg . features ) ,
29- ) ;
32+ ShouldEmit :: ErrorsAndLints ,
33+ )
34+ . as_bool ( ) ;
35+
3036 MacEager :: expr ( cx. expr_bool ( sp, matches_cfg) )
3137 }
32- Err ( err) => {
33- let guar = err. emit ( ) ;
34- DummyResult :: any ( sp, guar)
35- }
38+ Err ( guar) => DummyResult :: any ( sp, guar) ,
3639 } )
3740}
3841
39- fn parse_cfg < ' a > (
40- cx : & ExtCtxt < ' a > ,
41- span : Span ,
42- tts : TokenStream ,
43- ) -> PResult < ' a , ast:: MetaItemInner > {
44- let mut p = cx. new_parser_from_tts ( tts) ;
45-
46- if p. token == token:: Eof {
47- return Err ( cx. dcx ( ) . create_err ( errors:: RequiresCfgPattern { span } ) ) ;
42+ fn parse_cfg ( cx : & ExtCtxt < ' _ > , span : Span , tts : TokenStream ) -> Result < CfgEntry , ErrorGuaranteed > {
43+ let mut parser = cx. new_parser_from_tts ( tts) ;
44+ if parser. token == token:: Eof {
45+ return Err ( cx. dcx ( ) . emit_err ( errors:: RequiresCfgPattern { span } ) ) ;
4846 }
4947
50- let cfg = p. parse_meta_item_inner ( ) ?;
48+ let meta = MetaItemOrLitParser :: parse_single ( & mut parser, ShouldEmit :: ErrorsAndLints )
49+ . map_err ( |diag| diag. emit ( ) ) ?;
50+ let cfg = AttributeParser :: parse_single_args (
51+ cx. sess ,
52+ span,
53+ span,
54+ AttrStyle :: Inner ,
55+ AttrPath { segments : vec ! [ Ident :: from_str( "cfg" ) ] . into_boxed_slice ( ) , span } ,
56+ span,
57+ CRATE_NODE_ID ,
58+ Some ( cx. ecfg . features ) ,
59+ ShouldEmit :: ErrorsAndLints ,
60+ & meta,
61+ parse_cfg_entry,
62+ & CFG_TEMPLATE ,
63+ ) ?;
5164
52- let _ = p . eat ( exp ! ( Comma ) ) ;
65+ let _ = parser . eat ( exp ! ( Comma ) ) ;
5366
54- if !p . eat ( exp ! ( Eof ) ) {
55- return Err ( cx. dcx ( ) . create_err ( errors:: OneCfgPattern { span } ) ) ;
67+ if !parser . eat ( exp ! ( Eof ) ) {
68+ return Err ( cx. dcx ( ) . emit_err ( errors:: OneCfgPattern { span } ) ) ;
5669 }
5770
5871 Ok ( cfg)
0 commit comments