rust/tests/ui/macros/rfc-3086-metavar-expr/macro-expansion.rs
2024-05-10 12:29:17 -07:00

103 lines
3.8 KiB
Rust

//@ 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);
}