#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_single_mode_dispatch {
({
// Expression for the single typeid generator to provide to the main typeid generator macro
// This should be a :tt-bundle (in `[]`)
single_typeid_gen: $single_typeid_gen:tt,
match_block: {
$($(|)? $(@_)? $(type $type_alias:ident = $(@_)?)? $($($match_types:ty)|+)? $(as $witness:ident)?
=> $output_expr:expr
),*$(,)?
}
}) => {
$crate::__typematch_parse_typeid_generators!{{
unparsed_typeid_gens: $single_typeid_gen,
parsed_typeid_gens: [],
partially_parsed_match_arm_specs: [$({
unparsed_typeid_patterns: [@_ $(type $type_alias = )? $($($match_types)|+)? $(as $witness)?],
output_expr: {$output_expr}
})* ]
}}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_parse_typeid_generators {
({
unparsed_typeid_gens: [anyref ($anyid:ident = $anyref_expr:expr) $(, $($unparsed_typeid_gens:tt)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens:tt)*],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs:tt
}) => {
$crate::__typematch_parse_typeid_generators!{{
unparsed_typeid_gens: [$($($unparsed_typeid_gens)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens)* {
matchmode: anyref { $anyid },
expr: $crate::_reexports::core::any::Any::type_id($anyid),
pre_expr_name: $anyid,
pre_expr_ty_constraint: [&dyn $crate::_reexports::core::any::Any],
pre_expr: $anyref_expr
}],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs
}}
};
({
unparsed_typeid_gens: [anyref $anyid:ident $(, $($unparsed_typeid_gens:tt)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens:tt)*],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs:tt
}) => {
$crate::__typematch_parse_typeid_generators!{{
unparsed_typeid_gens: [$($($unparsed_typeid_gens)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens)* {
matchmode: anyref { $anyid },
expr: $crate::_reexports::core::any::Any::type_id($anyid),
pre_expr_name: $anyid,
pre_expr_ty_constraint: [&dyn $crate::_reexports::core::any::Any],
pre_expr: { $anyid }
}],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs
}}
};
({
unparsed_typeid_gens: [anymut ($anyid:ident = $anymut_expr:expr) $(, $($unparsed_typeid_gens:tt)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens:tt)*],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs:tt
}) => {
$crate::__typematch_parse_typeid_generators!{{
unparsed_typeid_gens: [$($($unparsed_typeid_gens)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens)* {
matchmode: anymut { $anyid },
expr: $crate::_reexports::core::any::Any::type_id(&*$anyid),
pre_expr_name: $anyid,
pre_expr_ty_constraint: [&mut dyn $crate::_reexports::core::any::Any],
pre_expr: $anymut_expr
}],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs
}}
};
({
unparsed_typeid_gens: [anymut $anyid:ident $(, $($unparsed_typeid_gens:tt)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens:tt)*],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs:tt
}) => {
$crate::__typematch_parse_typeid_generators!{{
unparsed_typeid_gens: [$($($unparsed_typeid_gens)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens)* {
matchmode: anymut { $anyid },
expr: $crate::_reexports::core::any::Any::type_id(&*$anyid),
pre_expr_name: $anyid,
pre_expr_ty_constraint: [&mut dyn $crate::_reexports::core::any::Any],
pre_expr: { $anyid }
}],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs
}}
};
({
unparsed_typeid_gens: [val ($val_id:ident = $val_expr:expr) $(, $($unparsed_typeid_gens:tt)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens:tt)*],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs:tt
}) => {
$crate::__typematch_parse_typeid_generators!{{
unparsed_typeid_gens: [$($($unparsed_typeid_gens)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens)* {
matchmode: val { val_id: $val_id },
expr: $crate::_reexports::core::any::Any::type_id(&$val_id),
pre_expr_name: $val_id,
pre_expr_ty_constraint: [_],
pre_expr: $val_expr
}],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs
}}
};
({
unparsed_typeid_gens: [val ($val_id:ident: $val_ty:ty = $val_expr:expr) $(, $($unparsed_typeid_gens:tt)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens:tt)*],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs:tt
}) => {
$crate::__typematch_parse_typeid_generators!{{
unparsed_typeid_gens: [$($($unparsed_typeid_gens)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens)* {
matchmode: val { val_id: $val_id, ty: $val_ty },
expr: $crate::_reexports::core::any::TypeId::of::<$val_ty>(),
pre_expr_name: $val_id,
pre_expr_ty_constraint: [$val_ty],
pre_expr: $val_expr
}],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs
}}
};
({
unparsed_typeid_gens: [val $val_id:ident $(, $($unparsed_typeid_gens:tt)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens:tt)*],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs:tt
}) => {
$crate::__typematch_parse_typeid_generators!{{
unparsed_typeid_gens: [$($($unparsed_typeid_gens)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens)* {
matchmode: val { val_id: $val_id },
expr: $crate::_reexports::core::any::Any::type_id(&$val_id),
pre_expr_name: $val_id,
pre_expr_ty_constraint: [_],
pre_expr: { $val_id }
}],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs
}}
};
({
unparsed_typeid_gens: [val $val_id:ident: $val_ty:ty $(, $($unparsed_typeid_gens:tt)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens:tt)*],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs:tt
}) => {
$crate::__typematch_parse_typeid_generators!{{
unparsed_typeid_gens: [$($($unparsed_typeid_gens)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens)* {
matchmode: val { val_id: $val_id, ty: $val_ty },
expr: $crate::_reexports::core::any::TypeId::of::<$val_ty>,
pre_expr_name: $val_id,
pre_expr_ty_constraint: [$val_ty],
pre_expr: { $val_id }
}],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs
}}
};
({
unparsed_typeid_gens: [out $type_to_match:ty $(, $($unparsed_typeid_gens:tt)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens:tt)*],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs:tt
}) => {
$crate::__typematch_parse_typeid_generators! {{
unparsed_typeid_gens: [$($($unparsed_typeid_gens)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens)* {
matchmode: out_ty { $type_to_match },
expr: $crate::_reexports::core::any::TypeId::of::<$type_to_match>(),
pre_expr_name: __type_preexpr,
pre_expr_ty_constraint: [()],
pre_expr: ()
}],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs
}}
};
({
unparsed_typeid_gens: [type $type_to_match:ty $(, $($unparsed_typeid_gens:tt)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens:tt)*],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs:tt
}) => {
$crate::__typematch_parse_typeid_generators! {{
unparsed_typeid_gens: [$($($unparsed_typeid_gens)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens)* {
matchmode: ty { $type_to_match },
expr: $crate::_reexports::core::any::TypeId::of::<$type_to_match>(),
pre_expr_name: __type_preexpr,
pre_expr_ty_constraint: [()],
pre_expr: ()
}],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs
}}
};
({
unparsed_typeid_gens: [$type_to_match:ty $(, $($unparsed_typeid_gens:tt)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens:tt)*],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs:tt
}) => {
$crate::__typematch_parse_typeid_generators! {{
unparsed_typeid_gens: [$($($unparsed_typeid_gens)*)?],
parsed_typeid_gens: [$($parsed_typeid_gens)* {
matchmode: ty { $type_to_match },
expr: $crate::_reexports::core::any::TypeId::of::<$type_to_match>(),
pre_expr_name: __type_preexpr,
pre_expr_ty_constraint: [()],
pre_expr: ()
}],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs
}}
};
({
unparsed_typeid_gens: [$(,)?],
parsed_typeid_gens: [$({
matchmode: $matchmode:ident $matchmode_data:tt,
expr: $typeid_expr:expr,
pre_expr_name: $pre_expr_name:ident,
pre_expr_ty_constraint: [$($pre_expr_ty_constraint:tt)*],
pre_expr: $pre_expr:expr
})*],
partially_parsed_match_arm_specs: $unparsed_match_arm_specs:tt
}) => {
$crate::__typematch_top_level_arms_syntax_split!{{
partially_parsed_match_arm_specs: $unparsed_match_arm_specs,
pre_match_statements: [
$(let $pre_expr_name: $($pre_expr_ty_constraint)* = $pre_expr;)*
],
matched_expression: [
($($typeid_expr,)*)
],
typeid_generator_info: [$({
matchmode: $matchmode $matchmode_data,
expr: $typeid_expr
})*]
}}
};
({
unparsed_typeid_gens: [$($unparseable_typeid_gens:tt)*],
$($_tail:tt)*
}) => {
$crate::_reexports::core::compile_error!(
$crate::_reexports::core::concat!(
"Unparseable typeid generator expressions found: ",
$crate::_reexports::core::stringify!(($($unparseable_typeid_gens)*)),
"\n",
"* `anyref <ident>` - simple anyref type-id-gen-expr\n",
"* `anyref (<ident> = <some expression producing &dyn Any or &impl Any>)` - anyref type-id-gen-expr with custom value\n",
"* `anymut <ident>` - simple anymut type-id-gen-expr\n",
"* `anymut (<ident> = <some expression producing &mut dyn Any or &impl Any>)` - anymut type-id-gen-expr with custom value\n",
"* `val <ident> [: <type>]?` - simply by-value type-id-gen-expr\n",
"* `val (<ident> [: <type>]? = <some expression producing value>)` - by-value type-id-gen-expr with expression\n",
"* `out <type>` - match on a given type, but provide the witness flipped for ease of use\n",
"* `type <type>` - match on a given type\n",
"* `<type>` - match on a given type\n",
)
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_top_level_arms_syntax_split {
({
partially_parsed_match_arm_specs: [$({
// Important note here - `_` is a pattern and will not be classified as an identifier.
//
// We cannot, however, extract it as a real variable because of follow-set issues,
// which means we can't provide users with checking
unparsed_typeid_patterns: [$($(@_)? $(type $type_alias:ident = $(@_)?)? $($($match_types:ty)|+)? $(as $witness:ident)?),*],
output_expr: $output_expr_bundle:tt
})*],
pre_match_statements: $pre_match_statements:tt,
matched_expression: $matched_expression_bundle:tt,
typeid_generator_info: $typeid_generator_info:tt
}) => {
$crate::__typematch_top_level_arms_branch_dispatch!{{
partially_parsed_match_arm_specs: [$({
arm_prefix_data: [],
leaf: {
remaining_typeid_patterns: [$({
type_branches: [
[[u] $([$($match_types)+])?]
$($([[t: $match_types]])+)?
],
type_alias: [$($type_alias)?],
witness_or_ignore: [$($witness)?]
})*],
output_expr: $output_expr_bundle
}
})*],
pre_match_statements: $pre_match_statements,
matched_expression: $matched_expression_bundle,
typeid_generator_info: $typeid_generator_info
}}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_top_level_arms_branch_dispatch {
($output:tt) => {{
$crate::__typematch_top_level_arms_branch_verify_exhaustive!(@entry $output);
$crate::__typematch_top_level_arms_branch_extract!($output)
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_top_level_arms_branch_verify_exhaustive {
(@entry {
partially_parsed_match_arm_specs: [$({
arm_prefix_data: [],
leaf: {
remaining_typeid_patterns: [$({
type_branches: $type_alternates:tt,
type_alias: $_type_alias:tt,
witness_or_ignore: $_witness_or_ignore:tt
})*],
output_expr: {$_output_expr:expr}
}
})*],
$($_other:tt)*
}) => {
$crate::__typematch_top_level_arms_branch_verify_exhaustive_inner!([$(
[$({alternates: $type_alternates})*]
)*])
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_top_level_arms_branch_verify_exhaustive_inner {
([]) => {
$crate::__macros_compile_error!("typematch statement is not exhaustive");
};
([
[$({alternates: [[ [u] ] $($_ts:tt)*]})*]
$($rest:tt)*
]) => {};
([
$_b0:tt
[$({alternates: [[ [u] ] $($_ts:tt)*]})*]
$($rest:tt)*
]) => {};
([
$_b0:tt
$_b1:tt
[$({alternates: [[ [u] ] $($_ts:tt)*]})*]
$($rest:tt)*
]) => {};
([
$_b0:tt
$_b1:tt
$_b2:tt
[$({alternates: [[ [u] ] $($_ts:tt)*]})*]
$($rest:tt)*
]) => {};
([
$_b0:tt
$_b1:tt
$_b2:tt
$_b3:tt
[$({alternates: [[ [u] ] $($_ts:tt)*]})*]
$($rest:tt)*
]) => {};
([
$_b0:tt
$_b1:tt
$_b2:tt
$_b3:tt
$_b4:tt
[$({alternates: [[ [u] ] $($_ts:tt)*]})*]
$($rest:tt)*
]) => {};
([
$_b0:tt
$_b1:tt
$_b2:tt
$_b3:tt
$_b4:tt
$_b5:tt
[$({alternates: [[ [u] ] $($_ts:tt)*]})*]
$($rest:tt)*
]) => {};
([
$_b0:tt
$_b1:tt
$_b2:tt
$_b3:tt
$_b4:tt
$_b5:tt
$_b6:tt
[$({alternates: [[ [u] ] $($_ts:tt)*]})*]
$($rest:tt)*
]) => {};
([
$_b0:tt
$($_b1:tt
$($_b2:tt
$($_b3:tt
$($_b4:tt
$($_b5:tt
$($_b6:tt
$($_b7:tt
$($rest:tt)*)?)?)?)?)?)?)?
]) => {
$crate::__typematch_top_level_arms_branch_verify_exhaustive_inner!([
$($($($($($($($($rest)*)?)?)?)?)?)?)?
])
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_top_level_arms_branch_extract {
({
partially_parsed_match_arm_specs: [$({
arm_prefix_data: $arm_prefix_data:tt,
leaf: {
remaining_typeid_patterns: [],
output_expr: {$output_expr:expr}
}
})*],
pre_match_statements: $pre_match_statements:tt,
matched_expression: $matched_expression_bundle:tt,
typeid_generator_info: $typeid_generator_info:tt
}) => {
$crate::__typematch_splay_typeid_generator_info!{{
match_arm_infos: [$({
arm_index_data: $arm_prefix_data,
typeid_generator_info: $typeid_generator_info,
output_expr: {$output_expr}
})*],
pre_match_statements: $pre_match_statements,
matched_expression: $matched_expression_bundle
}}
};
({
partially_parsed_match_arm_specs: [$({
arm_prefix_data: $arm_prefix_data:tt,
leaf: {
remaining_typeid_patterns: [
$next_typeid_pattern_0:tt
$next_typeid_pattern_1:tt
$next_typeid_pattern_2:tt
$next_typeid_pattern_3:tt
$($remaining_typeid_patterns:tt)*
],
output_expr: {$output_expr:expr}
}
})*],
$($tail:tt)*
}) => {
$crate::__typematch_top_level_arms_branch_splay!{{
partially_parsed_match_arm_specs: [$({
arm_prefix_data: $arm_prefix_data,
next_typeid_pattern: [
recurse $next_typeid_pattern_0 [
recurse $next_typeid_pattern_1 [
recurse $next_typeid_pattern_2 [
direct $next_typeid_pattern_3
]
]
]
],
append_tree: [],
leaf: {
remaining_typeid_patterns: [$($remaining_typeid_patterns)*],
output_expr: {$output_expr}
}
})*],
$($tail)*
}}
};
({
partially_parsed_match_arm_specs: [$({
arm_prefix_data: $arm_prefix_data:tt,
leaf: {
remaining_typeid_patterns: [
$next_typeid_pattern_0:tt
$next_typeid_pattern_1:tt
$($remaining_typeid_patterns:tt)*
],
output_expr: {$output_expr:expr}
}
})*],
$($tail:tt)*
}) => {
$crate::__typematch_top_level_arms_branch_splay!{{
partially_parsed_match_arm_specs: [$({
arm_prefix_data: $arm_prefix_data,
next_typeid_pattern: [
recurse $next_typeid_pattern_0 [
direct $next_typeid_pattern_1
]
],
append_tree: [],
leaf: {
remaining_typeid_patterns: [$($remaining_typeid_patterns)*],
output_expr: {$output_expr}
}
})*],
$($tail)*
}}
};
({
partially_parsed_match_arm_specs: [$({
arm_prefix_data: $arm_prefix_data:tt,
leaf: {
remaining_typeid_patterns: [$next_typeid_pattern:tt $($remaining_typeid_patterns:tt)*],
output_expr: {$output_expr:expr}
}
})*],
pre_match_statements: $pre_match_statements:tt,
matched_expression: $matched_expression_bundle:tt,
typeid_generator_info: $typeid_generator_info:tt
}) => {
$crate::__typematch_top_level_arms_branch_splay!{{
partially_parsed_match_arm_specs: [$({
arm_prefix_data: $arm_prefix_data,
next_typeid_pattern: [direct $next_typeid_pattern],
append_tree: [],
leaf: {
remaining_typeid_patterns: [$($remaining_typeid_patterns)*],
output_expr: {$output_expr}
}
})*],
pre_match_statements: $pre_match_statements,
matched_expression: $matched_expression_bundle,
typeid_generator_info: $typeid_generator_info
}}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_top_level_arms_branch_splay {
({
partially_parsed_match_arm_specs: [$({
arm_prefix_data: $arm_prefix_data:tt,
next_typeid_pattern: [direct {
type_branches: [$($type_branch_info:tt)*],
type_alias: $type_alias_info:tt,
witness_or_ignore: $witness_or_ignore_info:tt
}],
append_tree: $append_tree:tt,
leaf: $leaf:tt
})*],
$($tail:tt)*
}) => {
$crate::__typematch_top_level_arms_branch_append!{{
partially_parsed_match_arm_specs: [$($({
arm_prefix_data: $arm_prefix_data,
append_tree: [
$append_tree;
{
type_constraint: $type_branch_info,
type_alias: $type_alias_info,
witness_or_ignore: $witness_or_ignore_info
}
],
leaf: $leaf,
extra_data: []
} )*
)* ],
$($tail)*
}}
};
({
partially_parsed_match_arm_specs: [$({
arm_prefix_data: $arm_prefix_data:tt,
next_typeid_pattern: [recurse {
type_branches: [$($type_branch_info:tt)*],
type_alias: $type_alias_info:tt,
witness_or_ignore: $witness_or_ignore_info:tt
} $next_typeid_pattern:tt],
append_tree: $append_tree:tt,
leaf: $leaf:tt
})*],
$($tail:tt)*
}) => {
$crate::__typematch_top_level_arms_branch_splay!{{
partially_parsed_match_arm_specs: [$($({
arm_prefix_data: $arm_prefix_data,
next_typeid_pattern: $next_typeid_pattern,
append_tree: [
$append_tree;
{
type_constraint: $type_branch_info,
type_alias: $type_alias_info,
witness_or_ignore: $witness_or_ignore_info
}
],
leaf: $leaf
})* )* ],
$($tail)*
}}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_top_level_arms_branch_append {
({
partially_parsed_match_arm_specs: [$({
arm_prefix_data: [$($arm_prefix_data:tt)*],
append_tree: [],
leaf: $remaining_info:tt,
extra_data: [$($extra_data:tt)*]
})*],
$($tail:tt)*
}) => {
$crate::__typematch_top_level_arms_branch_extract!{{
partially_parsed_match_arm_specs: [$({
arm_prefix_data: [$($arm_prefix_data)* $($extra_data)*],
leaf: $remaining_info
})*],
$($tail)*
}}
};
({
partially_parsed_match_arm_specs: [$({
arm_prefix_data: [$($arm_prefix_data:tt)*],
append_tree: [[];$next_data_0:tt],
leaf: $remaining_info:tt,
extra_data: [$($extra_data:tt)*]
})*],
$($tail:tt)*
}) => {
$crate::__typematch_top_level_arms_branch_extract!{{
partially_parsed_match_arm_specs: [$({
arm_prefix_data: [$($arm_prefix_data)* $next_data_0 $($extra_data)*],
leaf: $remaining_info
})*],
$($tail)*
}}
};
({
partially_parsed_match_arm_specs: [$({
arm_prefix_data: [$($arm_prefix_data:tt)*],
append_tree: [[[]; $next_data_0:tt];$next_data_1:tt],
leaf: $remaining_info:tt,
extra_data: [$($extra_data:tt)*]
})*],
$($tail:tt)*
}) => {
$crate::__typematch_top_level_arms_branch_extract!{{
partially_parsed_match_arm_specs: [$({
arm_prefix_data: [
$($arm_prefix_data)*
$next_data_0
$next_data_1
$($extra_data)*
],
leaf: $remaining_info
})*],
$($tail)*
}}
};
({
partially_parsed_match_arm_specs: [$({
arm_prefix_data: [$($arm_prefix_data:tt)*],
append_tree: [[[[]; $next_data_0:tt];$next_data_1:tt];$next_data_2:tt],
leaf: $remaining_info:tt,
extra_data: [$($extra_data:tt)*]
})*],
$($tail:tt)*
}) => {
$crate::__typematch_top_level_arms_branch_extract!{{
partially_parsed_match_arm_specs: [$({
arm_prefix_data: [
$($arm_prefix_data)*
$next_data_0
$next_data_1
$next_data_2
$($extra_data)*
],
leaf: $remaining_info
})*],
$($tail)*
}}
};
({
partially_parsed_match_arm_specs: [$({
arm_prefix_data: [$($arm_prefix_data:tt)*],
append_tree: [[[[[]; $next_data_0:tt];$next_data_1:tt];$next_data_2:tt];$next_data_3:tt],
leaf: $remaining_info:tt,
extra_data: [$($extra_data:tt)*]
})*],
$($tail:tt)*
}) => {
$crate::__typematch_top_level_arms_branch_extract!{{
partially_parsed_match_arm_specs: [$({
arm_prefix_data: [
$($arm_prefix_data)*
$next_data_0
$next_data_1
$next_data_2
$next_data_3
$($extra_data)*
],
leaf: $remaining_info
})*],
$($tail)*
}}
};
({
partially_parsed_match_arm_specs: [$({
arm_prefix_data: $arm_prefix_data:tt,
append_tree: [[[[$rest:tt; $next_data_0:tt];$next_data_1:tt];$next_data_2:tt];$next_data_3:tt],
leaf: $remaining_info:tt,
extra_data: [$($extra_data:tt)*]
})*],
$($tail:tt)*
}) => {
$crate::__typematch_top_level_arms_branch_append!{{
partially_parsed_match_arm_specs: [$({
arm_prefix_data: $arm_prefix_data,
append_tree: $rest,
leaf: $remaining_info,
extra_data: [
$next_data_0
$next_data_1
$next_data_2
$next_data_3
$($extra_data)*
]
})*],
$($tail)*
}}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_splay_typeid_generator_info {
({
match_arm_infos: [$({
arm_index_data: [$({
type_constraint: $type_branch_info:tt,
type_alias: $type_alias_info:tt,
witness_or_ignore: $witness_or_ignore_info:tt
})*],
typeid_generator_info: [$({
matchmode: $matchmode:ident $matchmode_data:tt,
expr: $typeid_expr:expr
})*],
output_expr: {$output_expr:expr}
})*],
pre_match_statements: $pre_match_statements:tt,
matched_expression: $match_expression_bundle:tt
}) => {
$crate::__typematch_generate_match!{
pre_match_statements: $pre_match_statements,
matched_expression_bundle: $match_expression_bundle,
arm_data: [$({
index_data: [$({
type_constraint_bundle: $type_branch_info,
type_alias_bundle: $type_alias_info,
witness_or_ignore_bundle: $witness_or_ignore_info,
matching: $matchmode $matchmode_data,
expr_of_matching_typeid: $typeid_expr
})*],
output_expr: {$output_expr}
})*]
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_generate_match {
(
pre_match_statements: [$($pre_match_statements:tt)*],
matched_expression_bundle: [$matched_expr:expr],
arm_data: [$($single_arm_data:tt)*]
) => {{
$($pre_match_statements)*
match $matched_expr {$(
$crate::__typematch_arm_generate!(@entry {
arm_component: pattern,
capture_identifier: v,
arm_data: $single_arm_data
}) if $crate::__typematch_arm_generate!(@entry {
arm_component: pattern_guard,
capture_identifier: v,
arm_data: $single_arm_data
}) => $crate::__typematch_arm_generate!(@entry {
arm_component: expression,
capture_identifier: v,
arm_data: $single_arm_data
}),)*
_ => $crate::_reexports::core::unreachable!("typematch should ensure user-provided fallback guard")
}
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_arm_generate {
(@entry {
// This is `pattern`, `pattern_guard`, or `expression`
arm_component: $arm_component:ident,
capture_identifier: $capture_id:ident,
arm_data: {
index_data: [$({
type_constraint_bundle: $type_constraint_info:tt,
type_alias_bundle: $type_alias_info:tt,
witness_or_ignore_bundle: $witness_or_ignore_info:tt,
matching: $matchmode:ident $matchmode_data:tt,
expr_of_matching_typeid: $typeid_expr:expr
})*],
output_expr: {$output_expr:expr}
}
}) => {
$crate::__typematch_arm_check_delete!({
arm_component: $arm_component,
capture_identifier: $capture_id,
unchecked_indices: [$({
type_constraint_bundle: $type_constraint_info,
witness_or_ignore_bundle: $witness_or_ignore_info,
type_alias_bundle: $type_alias_info,
matching: $matchmode $matchmode_data,
expr_of_matching_typeid: $typeid_expr
})*],
checked_indices: [],
output_expr: {$output_expr}
})
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_arm_check_delete {
({
arm_component: $component:ident,
capture_identifier: $capture_id:ident,
unchecked_indices: [],
checked_indices: $checked:tt,
output_expr: {$output_expr:expr}
}) => {
$crate::__typematch_arm_create_components!({
arm_component: $component,
capture_identifier: $capture_id,
indices: $checked,
output_expr: {$output_expr}
})
};
({
arm_component: $component:ident,
capture_identifier: $capture_id:ident,
unchecked_indices: [{
// This is the "unconditional" one. If this is present without the delete marker,
// then this is definitely some form of unconstrained type specifier.
type_constraint_bundle: [ [u] ],
// if this is not empty, it contains an identifier (which can't be `_` because
// that's a pattern!). If it is empty, then it's empty.
witness_or_ignore_bundle:[$($witness:ident)?],
type_alias_bundle: $type_alias_bundle:tt,
matching: $matchmode:ident $matchmode_data:tt,
expr_of_matching_typeid: $typeid_expr:expr
} $($remaining_unchecked_indices:tt)*],
checked_indices: [$($checked:tt)*],
output_expr: {$output_expr:expr}
}) => {
$crate::__typematch_arm_check_delete!({
arm_component: $component,
capture_identifier: $capture_id,
unchecked_indices: [$($remaining_unchecked_indices)*],
checked_indices: [$($checked)* {
unconstrained {
witness_bundle: [$($witness)?],
type_alias_bundle: $type_alias_bundle,
matching: $matchmode $matchmode_data,
equality_match_expr: $typeid_expr,
extra: {}
}
}],
output_expr: {$output_expr}
})
};
({
arm_component: $component:ident,
capture_identifier: $capture_id:ident,
unchecked_indices: [{
type_constraint_bundle: [ [u] $_del_marker:tt],
$($_tail_data:tt)*
} $($_other_unchecked_indices:tt)*],
$($_rest:tt)*
}) => {
$crate::__typematch_arm_deleted!(arm_component: $component)
};
({
arm_component: $component:ident,
capture_identifier: $capture_id:ident,
unchecked_indices: [{
type_constraint_bundle: [[t: $constraining_type:ty]],
witness_or_ignore_bundle: [$($witness:ident)?],
type_alias_bundle: $type_alias_bundle:tt,
matching: $matchmode:ident $matchmode_data:tt,
expr_of_matching_typeid: $typeid_expr:expr
} $($other_unchecked_indices:tt)*],
checked_indices: [$($checked:tt)*],
output_expr: {$output_expr:expr}
}) => {
$crate::__typematch_arm_check_delete!({
arm_component: $component,
capture_identifier: $capture_id,
unchecked_indices: [$($other_unchecked_indices)*],
checked_indices: [$($checked)* {
constrained {
witness_bundle: [$($witness)?],
type_alias_bundle: $type_alias_bundle,
matching: $matchmode $matchmode_data,
equality_match_expr: {
$crate::_reexports::core::any::TypeId::of::<$constraining_type>()
},
extra: {
type_constraint: $constraining_type
}
}
}],
output_expr: {$output_expr}
})
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_arm_create_components {
({
arm_component: pattern,
capture_identifier: $capture_id:ident,
indices: [$({ unconstrained $_tt:tt })*],
output_expr: {$output_expr:expr}
}) => {
_
};
({
arm_component: pattern_guard,
capture_identifier: $capture_id:ident,
indices: [$({ unconstrained $_tt:tt })*],
output_expr: {$output_expr:expr}
}) => {
true
};
({
arm_component: pattern,
capture_identifier: $capture_id:ident,
indices: [$($checked:tt)*],
output_expr: {$output_expr:expr}
}) => {
$crate::__macros_force_pat!($capture_id)
};
({
arm_component: pattern_guard,
capture_identifier: $capture_id:ident,
indices: [$({ $_constrain_or_not:ident {
witness_bundle: $_witness_bundle:tt,
type_alias_bundle: $_type_alias_bundle:tt,
matching: $matchmode:ident $matchmode_data:tt,
equality_match_expr: $equality_match_expr:expr,
extra: $_extra:tt
}})*],
output_expr: {$output_expr:expr}
}) => {
{ $capture_id == ($($equality_match_expr,)*) }
};
({
arm_component: expression,
capture_identifier: $_capture_id:ident,
indices: [$({ $constrain_or_not:ident {
witness_bundle: [$($witness:ident)?],
type_alias_bundle: [$($type_alias_name:ident)?],
matching: $matchmode:ident $matchmode_data:tt,
equality_match_expr: $_equality_match_expr:expr,
extra: $constraint_data:tt
}})*],
output_expr: {$output_expr:expr}
}) => {{
$(
$(let $witness = $crate::__typematch_arm_make_witness!(
$constrain_or_not
$matchmode
$matchmode_data
$constraint_data
);)?
$(type $type_alias_name = $crate::__typematch_arm_make_type_alias!(
$constrain_or_not
$matchmode
$matchmode_data
$constraint_data
);)?
)*
$output_expr
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_arm_make_witness {
(constrained ty { $source_ty:ty } { type_constraint: $target_ty:ty }) => {
$crate::_reexports::cisness::LiveWitness::<$source_ty, $target_ty>::only_executed_if_same()
};
(constrained out_ty { $target_ty:ty } { type_constraint: $source_ty:ty }) => {
$crate::_reexports::cisness::LiveWitness::<$source_ty, $target_ty>::only_executed_if_same()
};
(constrained val { val_id: $val_id:ident } { type_constraint: $target_ty:ty }) => {{
let live_witness =
$crate::_deduce_witness::deduce_livewitness_from_ref::<$target_ty, _>(&$val_id);
live_witness.owned($val_id)
}};
(constrained val { val_id: $val_id:ident, ty: $ascribed_ty:ty } { type_constraint: $target_ty:ty }) => {
$crate::_reexports::cisness::LiveWitness::<$ascribed_ty, $target_ty>::only_executed_if_same(
)
.owned($val_id)
};
(constrained anyref { $anyref_var:ident } { type_constraint: $target_ty:ty }) => {
$anyref_var
.downcast_ref::<$target_ty>()
.expect("match has checked typeid")
};
(constrained anymut { $anymut_var:ident } { type_constraint: $target_ty:ty }) => {
$anymut_var
.downcast_mut::<$target_ty>()
.expect("match has checked typeid")
};
(unconstrained ty { $source_ty:ty } $extra:tt) => {
$crate::_reexports::core::any::TypeId::of::<$source_ty>()
};
(unconstrained out_ty { $target_ty:ty } $extra:tt) => {
$crate::_reexports::core::any::TypeId::of::<$target_ty>()
};
(unconstrained val { val_id: $val_id:ident $(, ty: $_ascribed_ty:ty)? } $extra:tt) => {
$val_id
};
(unconstrained anyref { $anyref_var:ident } $extra:tt) => {
$anyref_var
};
(unconstrained anymut { $anymut_var:ident } $extra:tt) => {
$anymut_var
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_arm_make_type_alias {
(constrained $matching:ident $matching_data:tt { type_constraint: $c_ty:ty }) => {
$c_ty
};
(unconstrained val { val_id: $val_id:ident, ty: $ascribed_ty:ty } $extra:tt) => {
$ascribed_ty
};
(unconstrained ty { $matched_ty:ty } $extra:tt) => {
$matched_ty
};
(unconstrained out_ty { $matched_ty:ty } $extra:tt) => {
$matched_ty
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_arm_deleted {
(arm_component: pattern) => {
_
};
(arm_component: pattern_guard) => {
false
};
(arm_component: expression) => {
unreachable!("deleted match arm")
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __typematch_arm_error {
(arm_component: expression $message:literal) => {
$crate::_reexports::core::compile_error!($message)
};
(arm_component: meta) => {};
(arm_component: pattern) => {
_
};
(arm_component: pattern_guard) => {
true
};
}