File: macro-expansion.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg3-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, sid, trixie
  • size: 893,396 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; perl: 29; lisp: 29; ruby: 19; sql: 11
file content (102 lines) | stat: -rw-r--r-- 3,869 bytes parent folder | download | duplicates (3)
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()}, ${len()})],
                    _counts: &[${count($x, 0)}, ${count($x, 1)}],
                    _nested: vec![
                    $(
                        Example {
                            _indexes: &[(${index(1)}, ${len(1)}), (${index()}, ${len()})],
                            _counts: &[${count($x)}],
                            _nested: vec![
                            $(
                                Example {
                                    _indexes: &[
                                        (${index(2)}, ${len(2)}),
                                        (${index(1)}, ${len(1)}),
                                        (${index()}, ${len()})
                                    ],
                                    _counts: &[],
                                    _nested: vec![],
                                    ${ignore($x)}
                                }
                            ),*
                            ]
                        }
                    ),*
                    ]
                }
            ),*
            ]
        }
    };
}

static EXPECTED: &str = concat!(
    "Example { _indexes: [], _counts: [13, 4, 2], _nested: [",
    concat!(
        "Example { _indexes: [(0, 2)], _counts: [10, 3], _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: [3, 1], _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);
}