@@ -3,6 +3,7 @@ use std::panic::{catch_unwind, AssertUnwindSafe};
3
3
use rustc_ast:: ast;
4
4
use rustc_ast:: token:: { Delimiter , TokenKind } ;
5
5
use rustc_parse:: parser:: ForceCollect ;
6
+ use rustc_parse:: parser:: Parser ;
6
7
use rustc_span:: symbol:: kw;
7
8
8
9
use crate :: parse:: macros:: build_stream_parser;
@@ -12,21 +13,20 @@ pub(crate) fn parse_cfg_if<'a>(
12
13
psess : & ' a ParseSess ,
13
14
mac : & ' a ast:: MacCall ,
14
15
) -> Result < Vec < ast:: Item > , & ' static str > {
15
- match catch_unwind ( AssertUnwindSafe ( || parse_cfg_if_inner ( psess, mac) ) ) {
16
+ let ts = mac. args . tokens . clone ( ) ;
17
+ let mut parser = build_stream_parser ( psess. inner ( ) , ts) ;
18
+
19
+ match catch_unwind ( AssertUnwindSafe ( || parse_cfg_if_inner ( & mut parser, vec ! [ ] ) ) ) {
16
20
Ok ( Ok ( items) ) => Ok ( items) ,
17
21
Ok ( err @ Err ( _) ) => err,
18
22
Err ( ..) => Err ( "failed to parse cfg_if!" ) ,
19
23
}
20
24
}
21
25
22
26
fn parse_cfg_if_inner < ' a > (
23
- psess : & ' a ParseSess ,
24
- mac : & ' a ast:: MacCall ,
27
+ parser : & mut Parser < ' a > ,
28
+ mut items : Vec < ast:: Item > ,
25
29
) -> Result < Vec < ast:: Item > , & ' static str > {
26
- let ts = mac. args . tokens . clone ( ) ;
27
- let mut parser = build_stream_parser ( psess. inner ( ) , ts) ;
28
-
29
- let mut items = vec ! [ ] ;
30
30
let mut process_if_cfg = true ;
31
31
32
32
while parser. token . kind != TokenKind :: Eof {
@@ -64,7 +64,11 @@ fn parse_cfg_if_inner<'a>(
64
64
{
65
65
let item = match parser. parse_item ( ForceCollect :: No ) {
66
66
Ok ( Some ( item_ptr) ) => item_ptr. into_inner ( ) ,
67
- Ok ( None ) => continue ,
67
+ Ok ( None ) => {
68
+ // maybe recursive if
69
+ items = parse_cfg_if_inner ( parser, items) ?;
70
+ continue ;
71
+ }
68
72
Err ( err) => {
69
73
err. cancel ( ) ;
70
74
parser. psess . dcx ( ) . reset_err_count ( ) ;
0 commit comments