summaryrefslogtreecommitdiffstats
path: root/tests/ui/macros/rfc-3086-metavar-expr/macro-expansion.rs
blob: b954967c4fe5a993c609ea801ca0494124e2bc24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// run-pass

#![feature(macro_metavar_expr)]

#[derive(Debug)]
struct Example<'a> {
    _indexes: &'a [(u32, u32)],
    _counts: &'a [u32],
    _nested: Vec<Example<'a>>,
}

macro_rules! example {
    ( $( [ $( ( $( $x:ident )* ) )* ] )* ) => {
        Example {
            _indexes: &[],
            _counts: &[${count(x, 0)}, ${count(x, 1)}, ${count(x, 2)}],
            _nested: vec![
            $(
                Example {
                    _indexes: &[(${index()}, ${length()})],
                    _counts: &[${count(x, 0)}, ${count(x, 1)}],
                    _nested: vec![
                    $(
                        Example {
                            _indexes: &[(${index(1)}, ${length(1)}), (${index()}, ${length()})],
                            _counts: &[${count(x)}],
                            _nested: vec![
                            $(
                                Example {
                                    _indexes: &[
                                        (${index(2)}, ${length(2)}),
                                        (${index(1)}, ${length(1)}),
                                        (${index()}, ${length()})
                                    ],
                                    _counts: &[],
                                    _nested: vec![],
                                    ${ignore(x)}
                                }
                            ),*
                            ]
                        }
                    ),*
                    ]
                }
            ),*
            ]
        }
    };
}

static EXPECTED: &str = concat!(
    "Example { _indexes: [], _counts: [2, 4, 13], _nested: [",
    concat!(
        "Example { _indexes: [(0, 2)], _counts: [3, 10], _nested: [",
        concat!(
            "Example { _indexes: [(0, 2), (0, 3)], _counts: [4], _nested: [",
            concat!(
                "Example { _indexes: [(0, 2), (0, 3), (0, 4)], _counts: [], _nested: [] }, ",
                "Example { _indexes: [(0, 2), (0, 3), (1, 4)], _counts: [], _nested: [] }, ",
                "Example { _indexes: [(0, 2), (0, 3), (2, 4)], _counts: [], _nested: [] }, ",
                "Example { _indexes: [(0, 2), (0, 3), (3, 4)], _counts: [], _nested: [] }",
            ),
            "] }, ",
            "Example { _indexes: [(0, 2), (1, 3)], _counts: [4], _nested: [",
            concat!(
                "Example { _indexes: [(0, 2), (1, 3), (0, 4)], _counts: [], _nested: [] }, ",
                "Example { _indexes: [(0, 2), (1, 3), (1, 4)], _counts: [], _nested: [] }, ",
                "Example { _indexes: [(0, 2), (1, 3), (2, 4)], _counts: [], _nested: [] }, ",
                "Example { _indexes: [(0, 2), (1, 3), (3, 4)], _counts: [], _nested: [] }",
            ),
            "] }, ",
            "Example { _indexes: [(0, 2), (2, 3)], _counts: [2], _nested: [",
            concat!(
                "Example { _indexes: [(0, 2), (2, 3), (0, 2)], _counts: [], _nested: [] }, ",
                "Example { _indexes: [(0, 2), (2, 3), (1, 2)], _counts: [], _nested: [] }",
            ),
            "] }",
        ),
        "] }, ",
        "Example { _indexes: [(1, 2)], _counts: [1, 3], _nested: [",
        concat!(
            "Example { _indexes: [(1, 2), (0, 1)], _counts: [3], _nested: [",
            concat!(
                "Example { _indexes: [(1, 2), (0, 1), (0, 3)], _counts: [], _nested: [] }, ",
                "Example { _indexes: [(1, 2), (0, 1), (1, 3)], _counts: [], _nested: [] }, ",
                "Example { _indexes: [(1, 2), (0, 1), (2, 3)], _counts: [], _nested: [] }",
            ),
            "] }",
        ),
        "] }",
    ),
    "] }",
);

fn main() {
    let e = example! {
        [ ( A B C D ) ( E F G H ) ( I J ) ]
        [ ( K L M ) ]
    };
    let debug = format!("{:?}", e);
    assert_eq!(debug, EXPECTED);
}