diff --git a/src/v1/05_emit_rust.dag b/src/v1/05_emit_rust.dag index b852469ca7f..ad8744a7068 100644 --- a/src/v1/05_emit_rust.dag +++ b/src/v1/05_emit_rust.dag @@ -6507,6 +6507,16 @@ fn variant_pattern_shape_key(rust_name: String, resolved_parent: String?) -> Str } } +fn variant_pattern_shape_str(qualified: String, rust_name: String, resolved_parent: String?, emit_info: EmitGraphInfo) -> String { + let shape_key = variant_pattern_shape_key(rust_name: rust_name, resolved_parent: resolved_parent) + let is_positional = set_contains(emit_info.positional_payload_variants, shape_key) + || set_contains(emit_info.positional_payload_variants, qualified) + let is_fielded = set_contains(emit_info.fielded_variants, shape_key) + || set_contains(emit_info.fielded_variants, qualified) + if is_positional { concat(qualified, "(_)") } + else if is_fielded { concat(qualified, " { .. }") } else { qualified } +} + fn emit_variant_pattern(name: String, parent_enum: String?, field_bindings: List, path_prefix: List, shared_types: Set, scrut_type: String, source_indices: Map, emit_info: EmitGraphInfo) -> String { let bare_name = qualified_last_segment(name: name) let resolved_parent = pattern_parent_enum(name: bare_name, parent_enum: parent_enum, scrut_type: scrut_type, type_summaries: emit_info.type_summaries) @@ -6560,25 +6570,13 @@ fn emit_variant_pattern(name: String, parent_enum: String?, field_bindings: List Absent => qualified } } else if field_bindings |> count == 0 { - let shape_key = variant_pattern_shape_key(rust_name: rust_name, resolved_parent: resolved_parent) - let is_positional = set_contains(emit_info.positional_payload_variants, shape_key) - || set_contains(emit_info.positional_payload_variants, qualified) - let is_fielded = set_contains(emit_info.fielded_variants, shape_key) - || set_contains(emit_info.fielded_variants, qualified) - if is_positional { concat(qualified, "(_)") } - else if is_fielded { concat(qualified, " { .. }") } else { qualified } + variant_pattern_shape_str(qualified: qualified, rust_name: rust_name, resolved_parent: resolved_parent, emit_info: emit_info) } else { let effective_bindings = field_bindings |> filter(fb => match field_binding_pattern(n: fb) { Wildcard => false _ => true } ) if effective_bindings |> count == 0 { - let shape_key2 = variant_pattern_shape_key(rust_name: rust_name, resolved_parent: resolved_parent) - let is_positional2 = set_contains(emit_info.positional_payload_variants, shape_key2) - || set_contains(emit_info.positional_payload_variants, qualified) - let is_fielded2 = set_contains(emit_info.fielded_variants, shape_key2) - || set_contains(emit_info.fielded_variants, qualified) - if is_positional2 { concat(qualified, "(_)") } - else if is_fielded2 { concat(qualified, " { .. }") } else { qualified } + variant_pattern_shape_str(qualified: qualified, rust_name: rust_name, resolved_parent: resolved_parent, emit_info: emit_info) } else { let binding_strs = effective_bindings |> map(fb => let fb_name = field_binding_name_at(n: fb, source_indices: source_indices) @@ -6822,25 +6820,13 @@ fn emit_variant_pattern_rc_aware(name: String, parent_enum: String?, field_bindi Absent => qualified } } else if field_bindings |> count == 0 { - let shape_key = variant_pattern_shape_key(rust_name: rust_name, resolved_parent: resolved_parent) - let is_positional = set_contains(emit_info.positional_payload_variants, shape_key) - || set_contains(emit_info.positional_payload_variants, qualified) - let is_fielded = set_contains(emit_info.fielded_variants, shape_key) - || set_contains(emit_info.fielded_variants, qualified) - if is_positional { concat(qualified, "(_)") } - else if is_fielded { concat(qualified, " { .. }") } else { qualified } + variant_pattern_shape_str(qualified: qualified, rust_name: rust_name, resolved_parent: resolved_parent, emit_info: emit_info) } else { let effective_bindings = field_bindings |> filter(fb => match field_binding_pattern(n: fb) { Wildcard => false _ => true } ) if effective_bindings |> count == 0 { - let shape_key2 = variant_pattern_shape_key(rust_name: rust_name, resolved_parent: resolved_parent) - let is_positional2 = set_contains(emit_info.positional_payload_variants, shape_key2) - || set_contains(emit_info.positional_payload_variants, qualified) - let is_fielded2 = set_contains(emit_info.fielded_variants, shape_key2) - || set_contains(emit_info.fielded_variants, qualified) - if is_positional2 { concat(qualified, "(_)") } - else if is_fielded2 { concat(qualified, " { .. }") } else { qualified } + variant_pattern_shape_str(qualified: qualified, rust_name: rust_name, resolved_parent: resolved_parent, emit_info: emit_info) } else { let binding_strs = effective_bindings |> map(fb => let fb_name = field_binding_name_at(n: fb, source_indices: source_indices) @@ -6886,6 +6872,65 @@ fn match_pattern_is_irrefutable(pattern: MatchPattern) -> Bool { } } +fn variant_pattern_shape_for(name: String, parent_enum: String?, scrut_type: String, emit_info: EmitGraphInfo) -> String { + let bare_name = qualified_last_segment(name: name) + let resolved_parent = pattern_parent_enum(name: bare_name, parent_enum: parent_enum, scrut_type: scrut_type, type_summaries: emit_info.type_summaries) + let optional_variant = is_optional_variant_name(name: bare_name) + && (is_optional_parent(parent_enum: resolved_parent) || resolved_parent == none) + let rust_name = if optional_variant { + if is_some_like_variant_name(name: bare_name) { "Some" } else { "None" } + } else { bare_name } + let qualified = if optional_variant { + rust_name + } else { + variant_pattern_qualified_path(rust_name: rust_name, resolved_parent: resolved_parent) + } + variant_pattern_shape_str(qualified: qualified, rust_name: rust_name, resolved_parent: resolved_parent, emit_info: emit_info) +} + +fn collect_pattern_rc_variant_guards(pattern: MatchPattern, rc_analysis: RcPatternAnalysis, shared_types: Set, source_indices: Map, emit_info: EmitGraphInfo) -> String { + match pattern { + VariantPattern { name: n, parent_enum: parent_enum, field_bindings: fbs } => + let bare_n = qualified_last_segment(name: n) + if is_optional_variant_name(name: bare_n) && is_optional_parent(parent_enum: parent_enum) { + if fbs |> count == 1 { + match fbs |> first { + Present { value: fb } => + let fb_pat = field_binding_pattern(n: fb) + let inner_analysis = analyze_rc_pattern(pattern: fb_pat, scrut_type: "", shared_types: shared_types, emit_info: emit_info, source_indices: source_indices) + collect_pattern_rc_variant_guards(pattern: fb_pat, rc_analysis: inner_analysis, shared_types: shared_types, source_indices: source_indices, emit_info: emit_info) + Absent => "" + } + } else { "" } + } else { + let resolved_parent = pattern_parent_enum(name: bare_n, parent_enum: parent_enum, scrut_type: "", type_summaries: emit_info.type_summaries) + let parts = fbs |> flat_map(fb => + let fb_name = field_binding_name_at(n: fb, source_indices: source_indices) + if fb_name == "0" { + let fb_pat = field_binding_pattern(n: fb) + let payload_scrut = positional_payload_scrut_type(parent_enum: resolved_parent, variant_name: bare_n, field_binding: fb, emit_info: emit_info, source_indices: source_indices) + let inner_analysis = analyze_rc_pattern(pattern: fb_pat, scrut_type: payload_scrut, shared_types: shared_types, emit_info: emit_info, source_indices: source_indices) + let inner = collect_pattern_rc_variant_guards(pattern: fb_pat, rc_analysis: inner_analysis, shared_types: shared_types, source_indices: source_indices, emit_info: emit_info) + if inner == "" { [] } else { [inner] } + } else if field_needs_rc_ref(field_name: fb_name, rc_analysis: rc_analysis) { + let fb_pat = field_binding_pattern(n: fb) + if match_pattern_is_irrefutable(pattern: fb_pat) { [] } + else { + match fb_pat { + VariantPattern { name: inner_n, parent_enum: inner_parent, field_bindings: _ } => + let shape = variant_pattern_shape_for(name: inner_n, parent_enum: inner_parent, scrut_type: "", emit_info: emit_info) + [concat("matches!(", emit_ident(name: fb_name, target: Rust), ".as_ref(), ", shape, ")")] + _ => [] + } + } + } else { [] } + ) + parts |> join(separator: " && ") + } + _ => "" + } +} + fn rc_pattern_preludes(pattern: MatchPattern, rc_analysis: RcPatternAnalysis, shared_types: Set, source_indices: Map, emit_info: EmitGraphInfo) -> String { match pattern { VariantPattern { name: n, parent_enum: parent_enum, field_bindings: fbs } => @@ -8773,17 +8818,15 @@ fn emit_typed_match_arm(arm: Node, registry: Map, scope: Infer emit_pattern(pattern: arm_pat, path_prefix: [], shared_types: shared_types, scrut_type: scrut_type, source_indices: si, emit_info: emit_info) } let field_guards = collect_pattern_string_guards(pattern: arm_pat, path_prefix: [], source_indices: si) + let rc_variant_guards = if rc_analysis.needs_rc_pattern { + collect_pattern_rc_variant_guards(pattern: arm_pat, rc_analysis: rc_analysis, shared_types: shared_types, source_indices: si, emit_info: emit_info) + } else { "" } let arm_guard_str = match arm_g { Present { value: g } => emit_typed_expr(texpr: g, registry: registry, scope: scope, depth: depth, shared_types: shared_types, emit_info: emit_info, fuel: 1024) Absent => "" } - let guard_str = if field_guards != "" && arm_guard_str != "" { - concat(" if ", field_guards, " && ", arm_guard_str) - } else if field_guards != "" { - concat(" if ", field_guards) - } else if arm_guard_str != "" { - concat(" if ", arm_guard_str) - } else { "" } + let guard_parts = [field_guards, rc_variant_guards, arm_guard_str] |> filter(g => g != "") + let guard_str = if guard_parts |> count == 0 { "" } else { concat(" if ", guard_parts |> join(separator: " && ")) } let body_str = match arm_b.expr_data { ExprVar { binding_kind: body_binding_kind } => let body_name = expr_var_name_at(texpr: arm_b, source_indices: si) @@ -9676,17 +9719,15 @@ fn emit_typed_tco_match_arm(arm: Node, fn_name: String, params: List, regi emit_pattern(pattern: arm_pat, path_prefix: [], shared_types: shared_types, scrut_type: scrut_type, source_indices: si, emit_info: emit_info) } let field_guards = collect_pattern_string_guards(pattern: arm_pat, path_prefix: [], source_indices: si) + let rc_variant_guards = if rc_analysis.needs_rc_pattern { + collect_pattern_rc_variant_guards(pattern: arm_pat, rc_analysis: rc_analysis, shared_types: shared_types, source_indices: si, emit_info: emit_info) + } else { "" } let arm_guard_str = match arm_g { Present { value: g } => emit_typed_expr(texpr: g, registry: registry, scope: scope, depth: depth, shared_types: shared_types, emit_info: emit_info, fuel: 1024) Absent => "" } - let guard_str = if field_guards != "" && arm_guard_str != "" { - concat(" if ", field_guards, " && ", arm_guard_str) - } else if field_guards != "" { - concat(" if ", field_guards) - } else if arm_guard_str != "" { - concat(" if ", arm_guard_str) - } else { "" } + let guard_parts = [field_guards, rc_variant_guards, arm_guard_str] |> filter(g => g != "") + let guard_str = if guard_parts |> count == 0 { "" } else { concat(" if ", guard_parts |> join(separator: " && ")) } let body_str = emit_typed_tco_expr(texpr: arm_b, fn_name: fn_name, params: params, registry: registry, scope: scope, depth: depth, shared_types: shared_types, emit_info: emit_info) if rc_analysis.needs_rc_pattern { let prelude = rc_pattern_preludes(pattern: arm_pat, rc_analysis: rc_analysis, shared_types: shared_types, source_indices: si, emit_info: emit_info) diff --git a/src/v1/stage0/src/v1_compiler_emit_rust.rs b/src/v1/stage0/src/v1_compiler_emit_rust.rs index 571dec5b125..3775902e6f1 100644 --- a/src/v1/stage0/src/v1_compiler_emit_rust.rs +++ b/src/v1/stage0/src/v1_compiler_emit_rust.rs @@ -16692,6 +16692,36 @@ pub fn variant_pattern_shape_key(rust_name: String, resolved_parent: Option, + emit_info: Rc, +) -> String { + { + let shape_key = variant_pattern_shape_key(rust_name.clone(), resolved_parent.clone()); + let is_positional = (v1_rt::set_contains( + &emit_info.positional_payload_variants.clone(), + shape_key.clone(), + ) || v1_rt::set_contains( + &emit_info.positional_payload_variants.clone(), + qualified.clone(), + )); + let is_fielded = + (v1_rt::set_contains(&emit_info.fielded_variants.clone(), shape_key.clone()) + || v1_rt::set_contains(&emit_info.fielded_variants.clone(), qualified.clone())); + if is_positional.clone() { + v1_rt::concat(qualified.clone(), "(_)".to_string()) + } else { + if is_fielded.clone() { + v1_rt::concat(qualified.clone(), " { .. }".to_string()) + } else { + qualified.clone() + } + } + } +} + pub fn emit_variant_pattern( name: String, parent_enum: Option, @@ -16751,7 +16781,7 @@ pub fn emit_variant_pattern( } } } - None => qualified.clone(), + None => qualified, } } else { if ((field_bindings.clone().len() as i64) == 1) { @@ -16770,7 +16800,7 @@ pub fn emit_variant_pattern( if is_string_lit_pattern(fb_pat.clone()) { v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), "(ref ".to_string()), + v1_rt::concat(qualified, "(ref ".to_string()), bind_name.clone(), ), ")".to_string(), @@ -16794,7 +16824,7 @@ pub fn emit_variant_pattern( ); v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), "(".to_string()), + v1_rt::concat(qualified, "(".to_string()), inner_pat.clone(), ), ")".to_string(), @@ -16819,10 +16849,7 @@ pub fn emit_variant_pattern( )); v1_rt::concat( v1_rt::concat( - v1_rt::concat( - qualified.clone(), - " { ref ".to_string(), - ), + v1_rt::concat(qualified, " { ref ".to_string()), bind_name.clone(), ), ", .. }".to_string(), @@ -16846,7 +16873,7 @@ pub fn emit_variant_pattern( ); v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), " { ".to_string()), + v1_rt::concat(qualified, " { ".to_string()), v1_rt::concat( v1_rt::concat( emit_ident( @@ -16865,37 +16892,16 @@ pub fn emit_variant_pattern( } } } - None => qualified.clone(), + None => qualified, } } else { if ((field_bindings.clone().len() as i64) == 0) { - { - let shape_key = - variant_pattern_shape_key(rust_name.clone(), resolved_parent.clone()); - let is_positional = (v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - shape_key.clone(), - ) || v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - qualified.clone(), - )); - let is_fielded = (v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - shape_key.clone(), - ) || v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - qualified.clone(), - )); - if is_positional.clone() { - v1_rt::concat(qualified.clone(), "(_)".to_string()) - } else { - if is_fielded.clone() { - v1_rt::concat(qualified.clone(), " { .. }".to_string()) - } else { - qualified.clone() - } - } - } + variant_pattern_shape_str( + qualified, + rust_name.clone(), + resolved_parent.clone(), + emit_info.clone(), + ) } else { { let effective_bindings = Rc::new({ @@ -16911,35 +16917,12 @@ pub fn emit_variant_pattern( __result }); if ((effective_bindings.clone().len() as i64) == 0) { - { - let shape_key2 = variant_pattern_shape_key( - rust_name.clone(), - resolved_parent.clone(), - ); - let is_positional2 = (v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - shape_key2.clone(), - ) || v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - qualified.clone(), - )); - let is_fielded2 = (v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - shape_key2.clone(), - ) || v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - qualified.clone(), - )); - if is_positional2.clone() { - v1_rt::concat(qualified.clone(), "(_)".to_string()) - } else { - if is_fielded2.clone() { - v1_rt::concat(qualified.clone(), " { .. }".to_string()) - } else { - qualified.clone() - } - } - } + variant_pattern_shape_str( + qualified, + rust_name.clone(), + resolved_parent.clone(), + emit_info.clone(), + ) } else { { let binding_strs = Rc::new({ @@ -17047,7 +17030,7 @@ pub fn emit_variant_pattern( let bindings_str = binding_strs.clone().join(&", ".to_string()); v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), " { ".to_string()), + v1_rt::concat(qualified, " { ".to_string()), bindings_str.clone(), ), ", .. }".to_string(), @@ -17497,7 +17480,7 @@ pub fn emit_variant_pattern_rc_aware( } } } - None => qualified.clone(), + None => qualified, } } else { if ((field_bindings.clone().len() as i64) == 1) { @@ -17516,7 +17499,7 @@ pub fn emit_variant_pattern_rc_aware( if is_string_lit_pattern(fb_pat.clone()) { v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), "(ref ".to_string()), + v1_rt::concat(qualified, "(ref ".to_string()), bind_name.clone(), ), ")".to_string(), @@ -17548,7 +17531,7 @@ pub fn emit_variant_pattern_rc_aware( ); v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), "(".to_string()), + v1_rt::concat(qualified, "(".to_string()), inner_pat.clone(), ), ")".to_string(), @@ -17573,10 +17556,7 @@ pub fn emit_variant_pattern_rc_aware( )); v1_rt::concat( v1_rt::concat( - v1_rt::concat( - qualified.clone(), - " { ref ".to_string(), - ), + v1_rt::concat(qualified, " { ref ".to_string()), bind_name.clone(), ), ", .. }".to_string(), @@ -17586,10 +17566,7 @@ pub fn emit_variant_pattern_rc_aware( if field_needs_rc_ref(fb_name.clone(), rc_analysis.clone()) { v1_rt::concat( v1_rt::concat( - v1_rt::concat( - qualified.clone(), - " { ref ".to_string(), - ), + v1_rt::concat(qualified, " { ref ".to_string()), emit_ident(fb_name.clone(), RenderTarget::Rust), ), ", .. }".to_string(), @@ -17620,10 +17597,7 @@ pub fn emit_variant_pattern_rc_aware( ); v1_rt::concat( v1_rt::concat( - v1_rt::concat( - qualified.clone(), - " { ".to_string(), - ), + v1_rt::concat(qualified, " { ".to_string()), v1_rt::concat( v1_rt::concat( emit_ident( @@ -17643,37 +17617,16 @@ pub fn emit_variant_pattern_rc_aware( } } } - None => qualified.clone(), + None => qualified, } } else { if ((field_bindings.clone().len() as i64) == 0) { - { - let shape_key = - variant_pattern_shape_key(rust_name.clone(), resolved_parent.clone()); - let is_positional = (v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - shape_key.clone(), - ) || v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - qualified.clone(), - )); - let is_fielded = (v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - shape_key.clone(), - ) || v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - qualified.clone(), - )); - if is_positional.clone() { - v1_rt::concat(qualified.clone(), "(_)".to_string()) - } else { - if is_fielded.clone() { - v1_rt::concat(qualified.clone(), " { .. }".to_string()) - } else { - qualified.clone() - } - } - } + variant_pattern_shape_str( + qualified, + rust_name.clone(), + resolved_parent.clone(), + emit_info.clone(), + ) } else { { let effective_bindings = Rc::new({ @@ -17689,35 +17642,12 @@ pub fn emit_variant_pattern_rc_aware( __result }); if ((effective_bindings.clone().len() as i64) == 0) { - { - let shape_key2 = variant_pattern_shape_key( - rust_name.clone(), - resolved_parent.clone(), - ); - let is_positional2 = (v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - shape_key2.clone(), - ) || v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - qualified.clone(), - )); - let is_fielded2 = (v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - shape_key2.clone(), - ) || v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - qualified.clone(), - )); - if is_positional2.clone() { - v1_rt::concat(qualified.clone(), "(_)".to_string()) - } else { - if is_fielded2.clone() { - v1_rt::concat(qualified.clone(), " { .. }".to_string()) - } else { - qualified.clone() - } - } - } + variant_pattern_shape_str( + qualified, + rust_name.clone(), + resolved_parent.clone(), + emit_info.clone(), + ) } else { { let binding_strs = Rc::new({ @@ -17848,7 +17778,7 @@ pub fn emit_variant_pattern_rc_aware( let bindings_str = binding_strs.clone().join(&", ".to_string()); v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), " { ".to_string()), + v1_rt::concat(qualified, " { ".to_string()), bindings_str.clone(), ), ", .. }".to_string(), @@ -17870,6 +17800,146 @@ pub fn match_pattern_is_irrefutable(pattern: Rc) -> bool { } } +pub fn variant_pattern_shape_for( + name: String, + parent_enum: Option, + scrut_type: String, + emit_info: Rc, +) -> String { + { + let bare_name = qualified_last_segment(name.clone()); + let resolved_parent = pattern_parent_enum( + bare_name.clone(), + parent_enum.clone(), + scrut_type.clone(), + emit_info.type_summaries.clone(), + ); + let optional_variant = (is_optional_variant_name(bare_name.clone()) + && (is_optional_parent(resolved_parent.clone()) || (resolved_parent.clone() == None))); + let rust_name = if optional_variant.clone() { + if is_some_like_variant_name(bare_name.clone()) { + "Some".to_string() + } else { + "None".to_string() + } + } else { + bare_name.clone() + }; + let qualified = if optional_variant.clone() { + rust_name.clone() + } else { + variant_pattern_qualified_path(rust_name.clone(), resolved_parent.clone()) + }; + variant_pattern_shape_str( + qualified.clone(), + rust_name.clone(), + resolved_parent.clone(), + emit_info.clone(), + ) + } +} + +pub fn collect_pattern_rc_variant_guards( + pattern: Rc, + rc_analysis: Rc, + shared_types: Rc>, + source_indices: Rc>>, + emit_info: Rc, +) -> String { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*pattern.clone()).clone() { + MatchPattern::VariantPattern { + name: n, + parent_enum, + field_bindings: fbs, + .. + } => { + let bare_n = qualified_last_segment(n.clone()); + if (is_optional_variant_name(bare_n.clone()) + && is_optional_parent(parent_enum.clone())) + { + if ((fbs.clone().len() as i64) == 1) { + match fbs.clone().first().cloned() { + Some(fb) => { + let fb_pat = field_binding_pattern(fb.clone()); + let inner_analysis = analyze_rc_pattern( + fb_pat.clone(), + "".to_string(), + shared_types.clone(), + emit_info.clone(), + source_indices.clone(), + ); + collect_pattern_rc_variant_guards( + fb_pat.clone(), + inner_analysis.clone(), + shared_types.clone(), + source_indices.clone(), + emit_info.clone(), + ) + } + None => "".to_string(), + } + } else { + "".to_string() + } + } else { + { + let resolved_parent = pattern_parent_enum( + bare_n.clone(), + parent_enum.clone(), + "".to_string(), + emit_info.type_summaries.clone(), + ); + let parts = Rc::new({ + let mut __result = Vec::new(); + for fb in fbs.clone().iter().cloned() { + __result.extend((*{ + let fb_name = field_binding_name_at(fb.clone(), source_indices.clone()); +if (fb_name.clone() == "0".to_string()) { + { + let fb_pat = field_binding_pattern(fb.clone()); +let payload_scrut = positional_payload_scrut_type(resolved_parent.clone(), bare_n.clone(), fb.clone(), emit_info.clone(), source_indices.clone()); +let inner_analysis = analyze_rc_pattern(fb_pat.clone(), payload_scrut.clone(), shared_types.clone(), emit_info.clone(), source_indices.clone()); +let inner = collect_pattern_rc_variant_guards(fb_pat.clone(), inner_analysis.clone(), shared_types.clone(), source_indices.clone(), emit_info.clone()); +if (inner.clone() == "".to_string()) { + Rc::new(vec![]) + } else { + Rc::new(vec![inner.clone()]) + } +} + } else { + if field_needs_rc_ref(fb_name.clone(), rc_analysis.clone()) { + { + let fb_pat = field_binding_pattern(fb.clone()); +if match_pattern_is_irrefutable(fb_pat.clone()) { + Rc::new(vec![]) + } else { + match (*fb_pat.clone()).clone() { + MatchPattern::VariantPattern { name: inner_n, parent_enum: inner_parent, .. } => { + let shape = variant_pattern_shape_for(inner_n.clone(), inner_parent.clone(), "".to_string(), emit_info.clone()); +Rc::new(vec![v1_rt::concat(v1_rt::concat(v1_rt::concat(v1_rt::concat("matches!(".to_string(), emit_ident(fb_name.clone(), RenderTarget::Rust)), ".as_ref(), ".to_string()), shape.clone()), ")".to_string())]) +}, + _ => Rc::new(vec![]), +} + } +} + } else { + Rc::new(vec![]) + } + } +}).iter().cloned()); + } + __result + }); + parts.clone().join(&" && ".to_string()) + } + } + } + _ => "".to_string(), + } + }) +} + pub fn rc_pattern_preludes( pattern: Rc, rc_analysis: Rc, @@ -23844,6 +23914,17 @@ pub fn emit_typed_match_arm( }; let field_guards = collect_pattern_string_guards(arm_pat.clone(), Rc::new(vec![]), si.clone()); + let rc_variant_guards = if rc_analysis.needs_rc_pattern.clone() { + collect_pattern_rc_variant_guards( + arm_pat.clone(), + rc_analysis.clone(), + shared_types.clone(), + si.clone(), + emit_info.clone(), + ) + } else { + "".to_string() + }; let arm_guard_str = match arm_g.clone() { Some(g) => emit_typed_expr( g.clone(), @@ -23856,26 +23937,29 @@ pub fn emit_typed_match_arm( ), None => "".to_string(), }; - let guard_str = if ((field_guards.clone() != "".to_string()) - && (arm_guard_str.clone() != "".to_string())) - { - v1_rt::concat( - v1_rt::concat( - v1_rt::concat(" if ".to_string(), field_guards.clone()), - " && ".to_string(), - ), + let guard_parts = Rc::new({ + let mut __result = Vec::new(); + for g in Rc::new(vec![ + field_guards.clone(), + rc_variant_guards.clone(), arm_guard_str.clone(), - ) - } else { - if (field_guards.clone() != "".to_string()) { - v1_rt::concat(" if ".to_string(), field_guards.clone()) - } else { - if (arm_guard_str.clone() != "".to_string()) { - v1_rt::concat(" if ".to_string(), arm_guard_str.clone()) - } else { - "".to_string() + ]) + .iter() + .cloned() + { + if (g.clone() != "".to_string()) { + __result.push(g); } } + __result + }); + let guard_str = if ((guard_parts.clone().len() as i64) == 0) { + "".to_string() + } else { + v1_rt::concat( + " if ".to_string(), + guard_parts.clone().join(&" && ".to_string()), + ) }; let body_str = match (*arm_b.expr_data.clone()).clone() { ExprData::ExprVar { @@ -26827,6 +26911,17 @@ pub fn emit_typed_tco_match_arm( }; let field_guards = collect_pattern_string_guards(arm_pat.clone(), Rc::new(vec![]), si.clone()); + let rc_variant_guards = if rc_analysis.needs_rc_pattern.clone() { + collect_pattern_rc_variant_guards( + arm_pat.clone(), + rc_analysis.clone(), + shared_types.clone(), + si.clone(), + emit_info.clone(), + ) + } else { + "".to_string() + }; let arm_guard_str = match arm_g.clone() { Some(g) => emit_typed_expr( g.clone(), @@ -26839,26 +26934,29 @@ pub fn emit_typed_tco_match_arm( ), None => "".to_string(), }; - let guard_str = if ((field_guards.clone() != "".to_string()) - && (arm_guard_str.clone() != "".to_string())) - { - v1_rt::concat( - v1_rt::concat( - v1_rt::concat(" if ".to_string(), field_guards.clone()), - " && ".to_string(), - ), + let guard_parts = Rc::new({ + let mut __result = Vec::new(); + for g in Rc::new(vec![ + field_guards.clone(), + rc_variant_guards.clone(), arm_guard_str.clone(), - ) - } else { - if (field_guards.clone() != "".to_string()) { - v1_rt::concat(" if ".to_string(), field_guards.clone()) - } else { - if (arm_guard_str.clone() != "".to_string()) { - v1_rt::concat(" if ".to_string(), arm_guard_str.clone()) - } else { - "".to_string() + ]) + .iter() + .cloned() + { + if (g.clone() != "".to_string()) { + __result.push(g); } } + __result + }); + let guard_str = if ((guard_parts.clone().len() as i64) == 0) { + "".to_string() + } else { + v1_rt::concat( + " if ".to_string(), + guard_parts.clone().join(&" && ".to_string()), + ) }; let body_str = emit_typed_tco_expr( arm_b.clone(),